SQL Server删除触发器 - 行句柄引用已删除的行或标记为删除的行

时间:2009-11-19 22:24:41

标签: sql-server triggers

我在表上有一个删除触发器,用于从另一个数据库中的表中删除条目。

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语句(SELECT d.ContractID FROM deleted d)时,我没有收到错误消息。添加select语句时它可以工作的原因是,通过在“已删除”上发出select,我已经锁定了“已删除”表吗? 它正在发布

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)

2 个答案:

答案 0 :(得分:4)

你的桌子上缺少主键! 添加主键,问题就会消失。

答案 1 :(得分:0)

如果您一直想从子表中删除记录,为什么不设置级联删除而不是触发?