あるデータベースに、別のデータベースのテーブルの ID を参照するテーブルがあります。挿入/更新の代わりにトリガーを設定して、他のテーブルに存在しない ID を挿入しないようにしました。これらのトリガーで、存在しない ID が見つかった場合はトランザクションを中止し、そうでない場合はトランザクションを続行します。
これが私が試したことです:
CREATE TRIGGER [dbo].[tr_check_student_insert]
ON [dbo].[student]
INSTEAD OF INSERT
AS
BEGIN
SET XACT_ABORT ON
IF (EXISTS ... )
BEGIN
RAISERROR (N'[teacher_id] does not exist in [teacher]',11,1)
END
IF (EXISTS ... )
BEGIN
RAISERROR (N'[class_id] does not exist in [class]',11,1)
END
INSERT INTO [dbo].[student] ...
END
その後、SET XACT_ABORT ON を使用しても RAISERROR がトランザクションを中止せず、エラーが発生した後も挿入 (または更新) が発生することを発見しました。
各条件を IF/ELSE IF ステートメントでラップし、ELSE で挿入を呼び出すことができることはわかっていますが、代わりにトランザクション全体をすぐに終了してロールバックする方法があるかどうか疑問に思っています。