【问题标题】:SQL Server - Row added via parent table trigger not available in child table triggerSQL Server - 通过父表触发器添加的行在子表触发器中不可用
【发布时间】:2012-01-10 07:10:22
【问题描述】:

我有 3 张桌子

  1. ParentTable
  2. ChildTable(列ParentIdParentTable
  3. Recording(列ParentId引用自己的表)

父表有一个触发器,它在Recording 表中添加一行。

子表再次有一个在Recording 表中追加行的触发器

现在我收到一个错误,指出在 Recording 表中找不到该行

INSERT 语句与 FOREIGN KEY SAME TABLE 冲突 约束

【问题讨论】:

  • 在您的问题中添加表格和触发器的定义。

标签: sql-server triggers dependencies foreign-key-relationship constraints


【解决方案1】:

您可能会触发重复的 ParentID 插入到 Recording 表中。如果 Recording 表中的 ParentID 上定义了唯一键,这将是正确的。

当插入到父表中时,您将带有 ParentID 的记录插入到 Recording 中。我认为您在 ChildTable 触发器上插入了重复的 ParentID。

也许您可以提供更多上下文。

此外,您可能希望尽可能避免触发 - 大多数情况下都是这样。使用 CTE 和 OUTPUT 子句可以帮助您避免触发器问题。

【讨论】:

  • 强烈反对避免触发因素的建议。很多时候,这是确保数据完整性的最佳方式。
  • @HLGEM 触发器占有一席之地,但有比触发器更好的方法来强制完整性。当您使用嵌套事务和大量数据时,从维护的角度来看,触发器会变得很痛苦。还有很多情况下,回滚也会导致完整性问题。 MS 正在远离触发器,最佳实践是开始做同样的事情。使用编码良好的 CTE,您不需要任何其他东西来确保您的完整性。
  • 只是为了清楚起见 - 我并不是强烈反对触发器,只是说尽量避免它们。如果系统很大程度上依赖于触发器,请将它们保留在那里。但对于任何新事物,总有比触发器更好的答案 - 如果您使用的是 SQL 2008 或更高版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多