SQL触发器:在更新主键时,如何确定哪个“已删除”记录对应于哪个“插入”记录?

时间:2011-07-08 19:13:24

标签: sql sql-server-2005 tsql triggers

假设我知道更新主键是坏事。

还有其他问题暗示insertedupdated表记录按位置匹配(第一个匹配另一个匹配。)这是事实还是巧合?

当主键在更新时发生更改时,是否有任何可以将两个表连接在一起的内容?

3 个答案:

答案 0 :(得分:8)

插入+删除的虚拟表行位置匹配。

不,你不能匹配行

一些选项:

  • 还有另一个唯一不变的(用于更新)键来链接行
  • 限制单行操作。
  • 使用带有OUTPUT子句的存储过程来捕获键之前和之后
  • 带有OUTPUT子句的INSTEAD OF触发器(TBH不确定你是否可以这样做)
  • 禁止主键更新(在评论后添加)

答案 1 :(得分:2)

每个表都允许有一个标识列。标识列不可更新;插入记录时(或添加列时)会为它们分配值,并且它们永远不会更改。如果主键是可更新的,则它不能是标识列。因此,表中有另一列是标识列,或者您可以添加一列。没有规则说明标识列必须是主键。然后在触发器中,具有相同标识值的插入更新中的行是同一行,并且您可以支持一次更新多行上的主键。

答案 2 :(得分:1)

是 - 在您要更新的表格中创建一个“old_primary_key”字段,并先填充它。

您无法匹配插入和删除的psuedo表记录键 - 即使您将数据存储在某个日志表中也是如此。

我猜或者,您可以创建一个单独的日志表来跟踪对主键(旧键和新键)的更改。这可能比我正在更新的表中添加字段更有用,因为它可以让您跟踪给定记录的多个更改。我想,这取决于你的情况。

但是那样说 - 在你做任何事之前,请找一个粉笔板写下这100次:

我知道更新主键很糟糕 我知道更新主键很糟糕 我知道更新主键很糟糕 我知道更新主键很糟糕 我知道更新主键很糟糕 ...

:-)(开玩笑)