2009-11-19 75 views
2

我在表中刪除觸發器,用於從另一個數據庫的表中刪除條目。SQL Server刪除觸發器 - 涉及刪除行或標記爲刪除的行的行句柄

CREATE TRIGGER [dbo].[Trigger_Contracts_Delete] ON [dbo].[Contracts] 
AFTER DELETE NOT FOR REPLICATION 
AS 
    IF @@ROWCOUNT = 0 RETURN 

    DELETE seconddb.dbo.second_table 
    WHERE contractId IN (SELECT d.ContractID FROM deleted d) 

當我用我的應用程序(傳統的應用程序沒有什麼瞭解其內部),我得到的錯誤刪除記錄「行控稱已刪除的行或列標記爲刪除」

然而,當我修改此觸發器以在刪除之前添加額外的選擇語句(SELECT d.ContractID FROM deleted d)。我沒有收到錯誤消息。當選擇語句被添加時,它可以工作的原因是什麼,通過發出「已刪除」選擇我已經鎖定了「已刪除」表? 它可以發出

CREATE TRIGGER [dbo].[Trigger_Contracts_Delete] ON [dbo].[Contracts] 
AFTER DELETE NOT FOR REPLICATION 
AS 
    IF @@ROWCOUNT = 0 RETURN 

    SELECT d.ContractID FROM deleted d; 

    DELETE seconddb.dbo.second_table 
    WHERE contractId IN (SELECT d.ContractID FROM deleted d) 
+0

seconddb.dbo.secondtable是否存在觸發器。通常,在嘗試從未提交事務中的表中引用行時發生此錯誤。只是想一想,嘗試添加一個NOLOCK提示到IN(SELECT d.ContractID FROM deleted d) – Sparky 2009-11-20 11:27:01

+0

感謝Sparky。以下是更多詳細信息 seconddb.dbo.second_table有一個子表seconddb.dbo.second_table_child,它具有級聯刪除關係[如果seconddb.dbo.second_table中的父記錄被刪除,seconddb.dbo.second_table_child中的子記錄將被刪除。 ]。 seconddb.dbo.second_table_child上有一個刪除觸發器,用於刪除seconddb.dbo.second_table_child中的一行時,更新seconddb.dbo.second_table中的父記錄。 – vijayp 2009-11-20 14:57:10

+0

您是否找到了解決方案? – 2010-05-26 00:32:18

回答

0

如果alawys想從子表中刪除的記錄,爲什麼不設置級聯delte而不是觸發?

+1

這些表位於不同的數據庫中,因此沒有外鍵。因此我們使用了觸發器。 – vijayp 2009-11-20 15:28:00

4

你的表缺少主鍵! 添加主鍵並且問題將消失。

+0

我希望我當時發佈了研究結果。現在我不記得了,也沒有回去的路 - 換工作。 – tech20nn 2010-10-22 13:34:31

+0

從來沒有經歷過這一點,但似乎根據http://robertoschiabel.wordpress.com/2008/10/20/row-handle-referred-to-a-deleted-row-or-a-row-marked-for-刪除/ – 2011-08-29 12:02:36