创建SQL触发器实现表间数据同步并自动生成更新时间戳
解决方案
问题根因
- 原第一个触发器每次触发会全量更新
OnHandInv全表匹配的binlocation字段,无需全量操作,仅需同步bincount中发生变动的行 - 原第二个触发器的筛选条件命中了
OnHandInv全表的PartNumber,且未判断是否是Binlocation字段发生变动,导致所有行的时间戳都被更新
修改后的触发器代码
1. bincount表同步触发器(支持新增/更新/删除场景)
替换原有tr_BC_totalbinLoc触发器,仅同步bincount中发生变动的行,同时覆盖删除场景:
--- 同步bincount变动到OnHandInv表 CREATE OR ALTER TRIGGER tr_BC_totalbinLoc ON bincount AFTER INSERT, UPDATE, DELETE AS BEGIN SET NOCOUNT ON; -- 处理新增/更新场景:更新OnHandInv对应行的binlocation IF EXISTS (SELECT * FROM inserted) BEGIN UPDATE OnHandInv SET binlocation = i.totalbinlo FROM inserted i INNER JOIN OnHandInv ON i.partnumber = OnHandInv.PartNumber; END -- 处理删除场景:清空OnHandInv对应行的binlocation(可根据业务调整删除逻辑) IF EXISTS (SELECT * FROM deleted) AND NOT EXISTS (SELECT * FROM inserted) BEGIN UPDATE OnHandInv SET binlocation = NULL FROM deleted d INNER JOIN OnHandInv ON d.partnumber = OnHandInv.PartNumber; END END
2. OnHandInv表时间戳更新触发器
替换原有tr_totalbinLoc_OHI触发器,仅在Binlocation字段变动时更新对应行的时间戳:
--- Binlocation变动时更新对应行时间戳 CREATE OR ALTER TRIGGER tr_totalbinLoc_OHI ON Onhandinv AFTER INSERT, UPDATE AS BEGIN SET NOCOUNT ON; -- 仅当Binlocation字段发生变动时触发更新 IF UPDATE(Binlocation) BEGIN UPDATE Onhandinv -- 如果需要直接存储为MM/DD/YYYY HH:MM:SS格式的字符串,可改为SET dateupdated = FORMAT(GETUTCDATE(), 'MM/dd/yyyy HH:mm:ss') SET dateupdated = GETUTCDATE() WHERE PartNumber IN (SELECT DISTINCT PartNumber FROM inserted); END END
补充说明
建议dateupdated字段使用datetime/datetime2类型存储时间值,查询展示时再通过FORMAT(dateupdated, 'MM/dd/yyyy HH:mm:ss')转换为指定格式,避免字符串存储带来的日期计算、排序问题。
触发器中添加SET NOCOUNT ON可以避免返回不必要的行数影响业务逻辑。
内容的提问来源于stack exchange,提问作者Jvang
相关产品推荐
相关产品推荐

