1

AbsencePKのあるテーブルがありますAbscenceId(スペルミスがあります)。別のテーブルNoteがあり、FKがAbsence呼び出さAbsenceIdれています(今回は正しいスペルです)。FK制約は次のとおりです。

ALTER TABLE [dbo].[Note]  WITH CHECK ADD  CONSTRAINT [FK_Note_Absence] FOREIGN KEY([AbsenceId])
REFERENCES [dbo].[Absence] ([AbscenceId])
GO

が削除されたとき、私はそれと一緒に行きAbsenceたいです。は他のものにも属することができるので、Notes私はこれを行うことができませんでした。CASCADESNote

そこで、不在が削除されたときにメモを削除するトリガーを作成しました。

ALTER TRIGGER [dbo].[TR_OnAbsenceDelete] ON [dbo].[Absence]
    FOR DELETE AS

    DELETE FROM [Note]
        WHERE AbsenceId IN ( SELECT AbscenceId FROM Deleted )

しかし、添付されてAbsenceいるを削除すると、次のようになります。Note

Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint "FK_Note_Absence". The conflict occurred in database "ReturnToWork", table "dbo.Note", column 'AbsenceId'.
The statement has been terminated.�

トリガーが実行されていないようなものですか?

4

2 に答える 2

3

トリガーは、最初にNoteから削除し、次にAbsenceから削除して、INSTEADOFトリガーとして記述する必要があります。

CREATE TRIGGER [dbo].[TR_OnAbsenceDelete] ON [dbo].[Absence]
    INSTEAD OF DELETE AS
BEGIN

    DELETE FROM n
        FROM deleted d
            INNER JOIN Note n
                ON d.AbscenceId = n.AbsenceId

    DELETE FROM a
        FROM deleted d
            INNER JOIN Absence a
                ON d.AbscenceId = a.AbscenceId
END
于 2012-07-17T20:22:22.273 に答える
1

問題は、不在からレコードを削除しようとすると、参照制約のために失敗することです。削除が成功すると、削除トリガーが呼び出されます。

また、このリンクで提案されているように、T-SQL 2005で削除する前にトリガーを起動するにはどうすればよいですか?

于 2012-07-17T20:12:42.103 に答える