2012-04-24 70 views
0

我有一個表在我的SQL Server數據庫中引用,我使用它與LINQ到SQL。LINQ到SQL:與觸發器相同的參考約束

我在這個表上創建了一個觸發器來處理刪除行。

ALTER TRIGGER [dbo].[TrgDeleteCalculation] 
ON [dbo].[Calculation] 
INSTEAD OF DELETE 
AS 
BEGIN 
    DELETE FROM Calculation WHERE CalcParentId IN (SELECT CalculationId FROM deleted) 
    DELETE FROM Calculation WHERE CalculationId IN (SELECT CalculationId FROM deleted) 
END 

當我嘗試在DataModel中執行刪除操作時,會出現問題。

當我這樣做時,出現以下異常: DELETE語句與SAME TABLE REFERENCE約束「FK_calculations_calculations」衝突。衝突發生在數據庫「DesignDb」,表「dbo.Calculation」,列「CalcParentId」中。 該聲明已被終止。

我懷疑觸發器不會被觸發...

是這樣的話,或可能是別的東西嗎?

回答

0

看起來像在第一個刪除查詢中要刪除的子記錄之一是另一個子行的父行。

退房這個帖子:

Self referencing foreign-key constraints and delete

+0

不應該觸發採取照顧?我假設在刪除子行時觸發器也會運行,然後刪除所有的子記錄等等......?簡單的遞歸(或者至少應該是)。 – 2012-04-29 16:27:12

+0

From [BOL](http://msdn.microsoft.com/zh-cn/library/ms189799.aspx):如果在表上定義的INSTEAD OF觸發器對通常會觸發INSTEAD OF觸發器的表執行語句同樣,該觸發器不會被遞歸調用。相反,該語句的處理方式與表沒有INSTEAD OF觸發器一樣,並啓動約束操作鏈和AFTER觸發器執行。 – 2012-04-29 17:25:17

+0

嗯,好的。所以觸發器對我而言幾乎沒用?我正在考慮留下整個想法,並使用LINQ to SQL DataModel來遞歸刪除所有行... – 2012-04-30 11:45:44