You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:06:04