SQL Server触发器Update多行操作归档到TableB的实现问题
触发器UPDATE分支实现方案
UPDATE操作触发时,DELETED临时表存储所有行更新前的旧值,INSERTED临时表存储所有行更新后的新值,两者通过TableA的主键key关联即可实现多行数据的对应归档,无需使用游标,具体代码如下:
else if (@wAction = 'U') begin insert into TableB (oldkey, oldfield, newkey, newfield) select d.key, d.field, i.key, i.field from DELETED d INNER JOIN INSERTED i ON d.key = i.key end
优化建议
- 所有插入TableB的语句都建议显式指定列名,避免后续表结构调整(比如新增字段、调整字段顺序)时触发器报错,你现有的INSERT、DELETE分支也可以同步修改:
-- INSERT分支调整后 insert into TableB (oldkey, oldfield, newkey, newfield) select null, null, key, field from inserted; -- DELETE分支调整后 insert into TableB (oldkey, oldfield, newkey, newfield) select key, field, null, null from deleted; - 如果你业务中存在修改TableA主键
key的场景,上述关联逻辑会失效,这种情况建议新增一个不会被修改的行唯一标识字段作为关联键,或者直接改用DML语句的OUTPUT子句实现归档逻辑。
内容的提问来源于stack exchange,提问作者zorino
相关产品推荐
相关产品推荐

