2012-03-08 7 views
1

テーブルAとテーブルBがあります。テーブルBにはテーブルBを参照する外部キー制約があります。ただし、SQL Server 2000ではカスケード削除のみがサポートされているため私はこれをトリガで解決することに決めました。このカスケード無効化トリガがSQL Server 2000で機能しない理由

問題は下記のトリガーが動作しません:

CREATE TRIGGER dbo.TR_A_B_CascadingNullify ON dbo.A 
FOR DELETE 
AS 
    UPDATE dbo.B 
    SET idA = NULL 
    WHERE idA IN (SELECT id FROM DELETED) 
; 

に参照されていないという点で、行を削除すると、すべてが動作します。行に参照さ削除された場合でも、それはメッセージDELETE statement conflicted with COLUMN REFERENCE constraint 'FK_B_A'. The conflict occurred in database 'x', table 'B', column 'idA'.

と外部キー制約に失敗し、NoにオプションEnforce Foreign Key Constraintを設定するときに最後に、トリガが作業を行い、テーブルBの列がNULLに設定されています。

私は間違っていますか?

答えて

2

の後にトリガーが発生します。つまり、すべての参照チェックが完了した後です。 documentation of CREATE TRIGGER;

AFTER is the default when FOR is the only keyword specified.

からあなたの唯一のオプションは、私の知る限りINSTEAD OFトリガーを使用することです。

+0

私はドキュメントで誤解されました。オプションが何を意味しているのかを私にはっきりさせることではなく、FORはAFTERとINSTEAD OFの代替のように見えました...とにかく、今はかなりうまくいきます。 – doekman

2

おそらく最も簡単な解決策は、AFTERトリガーではなく、INSTEAD OFトリガーを使用することです。その後、DELETE操作自体は実際には起こりません。代わりに、トリガーに入れたロジックが実行されます。

標準的なコメントとして、SQL 2000はMicrosoftによってサポートされなくなりましたので、できるだけ早く新しいバージョンにアップグレードする必要があります。

+0

SQL 2000はサポートされなくなりました。だから、MS Access 97です。しかし、どちらも生産現場で積極的に使用されており、私はそれについて何もできません。 – doekman

関連する問題