私はテーブルUniversitiesとテーブルCitiesを持っています。それらの間にはam:nの関係があるため、関係はCityUniversitiesと呼ばれる別のテーブルに保存されます。ここで、大学から大学を削除するときに、CitiesとUniversitiesのテーブル間のすべての関係を削除するトリガーを作成したいと思いました。しかし、それは機能していません。大学を削除しようとすると、常に次のエラーメッセージが表示されます。
「メッセージ547、レベル16、状態0、2行目DELETEステートメントがREFERENCE制約「FK_CityUniversities_Universities」と競合しました。データベース「Alumni_Dev」、テーブル「dbo.CityUniversities」、列「UniversityId」で競合が発生しました。ステートメントは終了しました。」
これが、私が実装して正常に実行したトリガー(テーブル大学の場合)です。
USE [Alumni_Dev]
GO
/****** Object: Trigger [dbo].[deleteUni] Script Date: 05/02/2012 11:42:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[deleteUni]
ON [dbo].[Universities]
FOR DELETE
AS
DECLARE @UniId int
SELECT @UniId = (SELECT UniversityId FROM deleted)
BEGIN
--Remove constraints
DELETE FROM dbo.CityUniversities WHERE UniversityId = @UniId;
END
私はすでに自分の解決策をいくつかの参考文献と比較しましたが、間違っている可能性のあるものは何も見つかりません。影響を受けるテーブルの1つに間違った設定がある可能性がありますか?
何か提案をいただければ幸いです。
私はついに次のトリガー(ニコラへのthx)で私の問題を解決しました:
ALTER TRIGGER [dbo].[deleteUni]
ON [dbo].[Universities]
INSTEAD OF DELETE
AS
DECLARE @UniId int
SELECT @UniId = UniversityId FROM deleted
BEGIN
--Remove constraints
DELETE FROM dbo.CityUniversities WHERE UniversityId = @UniId;
DELETE FROM dbo.Universities WHERE UniversityId = @UniId;
END