2015-10-14 76 views
0

我有:級聯刪除通觸發

  1. 表 「項目」 與PK ID

  2. 的表的 「區段」 與PK ID和FK專案編號

  3. 表「卡爾斯「與PK ID和FK了zoneid

  4. 觸發:

    ALTER TRIGGER [DBO]。[DeleteProject] ON [DBO]。[項目] INSTEAD OF DELETE AS DECLARE @ProjectID INT SELECT @ProjectID = deleted.ID FROM刪除

    DELETE區域,其中專案編號= @專案編號

    DELETE項目 FROM DELETED d INNER JOIN項目T ON T.ID = D.ID

  5. 觸發:

    ALTER TRIGGER [DBO]。[DeleteZone] ON [DBO]。[區域] INSTEAD OF DELETE AS DECLARE @ZoneID INT SELECT @ZoneID = deleted.ID FROM刪除

    DELETE卡爾斯WHERE =了zoneid @ZoneID

    DELETE [區域] FROM DELETED d INNER JOIN [區域] T ON T.ID = D.ID

一般它的工作原理和工作正常,但我得到一個錯誤

{「DELETE語句與REFERENCE約束條件衝突 \」FK_Cals_Zones \「。衝突發生於數據庫\ 「PlasmaAir \」, 表\ 「dbo.Cals \」,列 '了zoneid'。\ r \ n此語句已 終止。「}

時 1.區段有2次記錄相同的專案編號 2.計算器與從了zoneid#1

至少一個記錄爲什麼會發生,以及如何解決呢?

+2

第一件事,你的觸發器是嚴重designed.YOu決不能有西港島線只有一個插入或刪除表中的記錄,所以從他們的一個設定值,一個標量意味着觸發需要重寫。 – HLGEM

+1

你似乎有觸發火災每排一次誤解。在sql服務器觸發每個操作觸發一次。在SQL Server觸發器都必須根據設置或您遇到的各種問題。 –

+0

OK,怎麼是正確的。讓我們看看第一個觸發器。行正在刪除並調用此觸發器。然後刪除項目ID的值被設置爲@ProjectID。然後刪除鏈接到此ProjectID的所有區域(即2個區域)。每個刪除區域操作都會調用第二個觸發器(彼此獨立)。對觸發器工作的理解是否正確? –

回答

2

我的猜測是,你刪除了多條記錄。您觸發器僅刪除CALS中的第一個,但它們全部來自區域,其中一些仍在CALS中。

假設當你刪除一個項目時,它有三個區域記錄。你的第一個觸發器代碼嘗試刪除所有那裏,而不是觸發器。這個只選擇其中一條記錄從CAL中刪除。然後它會嘗試刪除已刪除表中的所有內容(其中有三條記錄不是一條記錄),其中一條或多條記錄在CAL中有記錄,因此您按FK約束,刪除失敗。

你需要讓兩個觸發器基於完全設置和刪除該拉從已刪除的表數據的任何數值變量的所有引用。他們不屬於SQL服務器中的觸發器。第一

+0

真的卡爾斯只有一個記錄(第一區,第二區沒有它)。但是不要緊。想象一下,卡爾斯也有2條記錄。似乎,我不完全理解觸發器的邏輯。我想,那觸發器也會刪除級聯。調用「父」觸發器並刪除當前記錄,然後調用子觸發器等,等等 –