【发布时间】:2016-10-03 07:59:35
【问题描述】:
我有两个表(Table1、Table2),Table1 中的 Id 是 Table2 中的外键。两个表都在删除更新其他表(表 3)时触发。删除 Table1 级联删除 Table2。当我执行时
delete from Table1
where Table4Id = @table4Id
我在 Table2 触发器上遇到编译超时
SQL Server parse and compile time:
CPU time = 391 ms, elapsed time = 10726 ms.
StatementOptmEarlyAbortReason="TimeOut"
从 Table1 中删除触发器
UPDATE table3
SET table3.Column1 = NULL
FROM Table3 AS table3
JOIN DELETED AS deleted ON deleted.Table4Id = table3.Table4Id
WHERE deleted.Column1 = 1
从 Table2 中删除触发器
UPDATE table3
SET table3.Column1 = NULL
FROM Table1 AS table1
JOIN DELETED AS deleted on deleted.Table1Id = table1.Id
JOIN Table3 AS table3 ON deleted.Table3Id = table3.Id
WHERE table1.Column1 = 1 AND table1.Table4Id = table3.Table4Id
有没有办法摆脱这个编译超时?
【问题讨论】:
-
我猜这可能是因为你的级联删除你强制两个删除触发器在同一个事务中更新同一个表中的同一个字段。两个触发器都试图锁定它以更新它,但必须相互等待。
-
执行删除语句不会编译任何东西。当您在“从 table1 中删除...”上按 F5 或在“创建触发器...”上按 F5 时是否会收到错误?
-
当我在“从 Table1 中删除 ...”中按 F5 时出现此超时
-
所以你在编译时不会出错,你没有编译任何东西
-
您正在删除记录,而不是编译任何内容。级联表上的触发器正在触发,因为它们都试图锁定同一个表,所以你会超时。看我的回答,去掉触发器,去掉级联删除,在table1上创建一个instead of trigger
标签: sql-server timeout