我在SQL Server 2008中有一个更新触发器。如果某些列已被修改,我只需要执行触发器操作。因此,我想检查一下发生了什么变化。TSQL更新触发器:加入插入和删除
T-SQL提供了“if update(columnName)”构造。但是,如果许多行已经更新,其中只有一个单一的一个改变了特定的列值“如果更新()”将不得不返回true。这将使我执行触发器操作的行数远多于所需的行数。
因此,不是使用“if update()”,我认为我只需加入虚拟删除和插入表(更新前后的行)并自己比较相关列。但是,我怎样才能加入这两张桌子呢?我无法使用表的主键,因为这可能是由更新修改的。我唯一能想到的就是通过row_number()进行连接,即隐式表格排序。这种感觉非常错误的,虽然我不知道SQL Server是否确实提供了在插入的行命令一样删除任何guarantuees。
永远不会改变主键。如果您需要更改主键的值,那么您应该使用代理主键,如身份。 – 2010-02-10 13:49:45
为什么外键约束允许“更新级联/设置为空”如果“永不改变主键”就是这样一个铁律?如果主键由在现实世界中有意义的东西组成,它可能会在某个时刻发生改变。我尽量避免它在可能的情况下,我自己的模式具有不可变的主键,但我不认为它是一个绝对的禁忌?在这种特殊情况下,模式设计不在我的控制之下,所以我对此无能为力。 – BuschnicK 2010-02-10 14:26:28
外键可能指的是唯一的约束,不仅对PK。这可以在一个非常简单的系统中使你的参数aobut CASCADE – 2010-02-10 15:01:41