2009-04-19 14 views
0

Sybase用のトリガーを作成しますが、エラーが表示されます。SQLトリガーの質問:なぜこれは構文エラーですか?

私がしたいのは、[student]テーブルで削除操作が行われたときに、[アカウント]に生徒に関連するレコードがあるかどうかを確認することです。

Sybaseのサポートが不足しているようです。彼らの役人は訪問しないようです。

*CREATE TRIGGER AccountChecker 
BEFORE DELETE ON student 
REFERENCING OLD AS old_student 
FOR EACH ROW 
BEGIN 
DECLARE @acc CHAR(4); 
DECLARE @acc_not_null EXCEPTION FOR SQLSTATE '99999'; 

SELECT @acc=account.account_number FROM account 
WHERE account.student_id = old_student.student_id; 

    IF @acc IS NOT NULL 
    BEGIN 
    SIGNAL acc_not_null 
    END 

END* 
+0

どのようなエラーが表示されますか?私は、Sybase ISQLを使用しています –

+0

、それは近いラインにBEGIN示し:14、しかし@accがnullでない場合、私は を削除する場合 BEGIN SIGNAL END acc_not_nullそれはまだエラー、私はから9行目(スタートから削除する場合選択...)から15行目まで、成功します。 – Cheung

+0

正解:BEGINの近くにエラーが表示されます:14 – Cheung

答えて

3

Sybaseは、sp_primarykeyおよびsp_foreignkeyなどのプロシージャと、宣言的なSQL制約を介して、外部キーおよび主キーをサポートしています。あなたがしようとしているのは、ちょうど[学生]を参照する[アカウント]からの外部キーがすべきことです。

のSybase SQLユーザーズ・ガイド(Adaptive Serverの15、それが重要な場合は)(多少異なるインデント付き)「を削除制限された」トリガーを示しています

create trigger deltitle 
    on titles 
    for delete 
    as 
     if (select count(*) 
       from deleted, salesdetail 
       where salesdetail.title_id = 
       deleted.title_id) > 0 
     begin 
      rollback transaction 
      print "You cannot delete a title with sales." 
     end 

私はロールバックは良いアイデアであることを確信していません;おそらく例外がより良いでしょう。

使用しようとしている表記法は、文書化されているSybaseがサポートしている表記法よりもSQL標準に近いものです。

+0

ありがとう、Jonathan Leffler 良い代替ソリューションです。 – Cheung

1

Sybaseは外部キーをサポートしていませんか?