【问题标题】:How to create a trigger in SQL Server that fires only right before the transaction will be committed如何在 SQL Server 中创建仅在提交事务之前触发的触发器
【发布时间】:2013-08-07 16:44:19
【问题描述】:

所以我遇到了如下问题:
- 我有A表。
- 我有表 B,它有表 A 的外键。
- 我在表 A 上有一个触发器,可确保表 A 中的每个项目在表 B 中至少有一行指向它(通过外键)。
- 触发器运行“插入”命令。

现在的问题是,当我插入表 A 时,触发器会引发错误,因为表 B 还没有包含指向表 A 中新行的外键的行。表 B 上的行将在事务结束时插入,但触发器没有给我机会。

那么什么是解决问题的好方法呢?有没有办法告诉触发器仅在事务中的最后一个命令执行后才运行?

【问题讨论】:

  • 为什么要使用触发器来强制执行外键关系?这已经为您 BY 完成了外键。您想要的是 A 上的触发器以执行所需的插入 B
  • 将触发器从表 A 移动到表 B
  • Marc B - 触发器不是强制外键。触发器是强制表 B 至少有一个行引用表 A。
  • LastCoder - 我在表 B 上已经有一个版本,但我在表 A 中需要另一个版本,因为有人可能会插入表 A 而不会在表 B 上插入相应的行。
  • “有没有办法告诉触发器仅在事务中的最后一个命令执行后才运行?” -> 没有。我想知道这个讨论将如何发展.

标签: sql-server triggers transactions foreign-keys rollback


【解决方案1】:

如果您需要在表 A 上触发触发器,但不知道表 b 中是否有任何相应的行,则应使用“INSTEAD OF”触发器。这将允许您在将行插入表 A 之前检查表 B。如果表 B 中有匹配项,则继续插入到 A 中,否则,将行添加到 b 然后 A,或者跳过不匹配的数据并向应用程序返回错误。

http://msdn.microsoft.com/en-us/library/ms175521(v=SQL.105).aspx

【讨论】:

  • 问题是在插入表A之前不能先插入表B。记住表B中的一列是表A的外键,不能设置到表中的行插入表 A 并为其分配一个 id,该 id 将用于表 B 中的外键列。
  • 您将无法在代替触发器的范围之外做您想做的事情。您可以在表 A 上使用而不是触发器来插入表,然后使用输出子句加载表 B。
猜你喜欢
  • 1970-01-01
  • 2011-10-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2013-05-25
  • 2022-08-04
  • 1970-01-01
相关资源
最近更新 更多