【发布时间】:2009-11-19 22:24:41
【问题描述】:
我在一个表上有一个删除触发器,用于从另一个数据库的表中删除条目。
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) 时。我没有收到错误消息。添加 select 语句时它起作用的原因是什么,是否通过在“deleted”上发出 select 我锁定了“deleted”表?
它正在发出一个
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)
【问题讨论】:
-
seconddb.dbo.secondtable 上是否有触发器。通常,当尝试在未提交事务的中间引用表中的行时,会发生此错误。只是想一想,尝试在 IN (SELECT d.ContractID FROM deleted d) 中添加一个 NOLOCK 提示
-
谢谢 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 中的父记录。
-
您找到解决方案了吗?
标签: sql-server triggers