更新触发器后不更新 SQL 表中的特定数据行

Posted

技术标签:

【中文标题】更新触发器后不更新 SQL 表中的特定数据行【英文标题】:After update trigger not updating specific row of data in SQL table 【发布时间】:2020-11-10 10:10:09 【问题描述】:

这里的 SQL 相当新...我试图在 SQL Server 中获得一个“更新后”触发器,以在更新另一列 (rig_id) 时更新一列 (rig_ident)。通过搜索rig_log 表找到rig_ident

使用下面的代码它可以工作,但我担心它可能会遍历表中的每一行并进行相应的检查,这将浪费处理和时间!谁能提供有关如何正确执行此操作的建议?

ALTER TRIGGER engineer_log_onUpdate_trig 
ON engineer_log 
AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    IF (UPDATE(rig_id))
    BEGIN
        DECLARE @rigNum AS int
        DECLARE @rigId AS int

        SELECT @rigNum = i.rig_id 
        FROM inserted i --get the updated rig id value

         --get the required rig ident value from rig_log table...
        SELECT @rigId = ident 
        FROM rig_log 
        WHERE rig_id = @rigNum

        --try to update the rig_ident column of the row the user is updating...
        UPDATE engineer_log 
        SET rig_ident = @rigId 
        WHERE rig_id = @rigNum
    END
END

【问题讨论】:

您假设触发器只会触发 1 行,但事实并非如此。 inserteddeleted 表可能包含超过 1 行。您的触发器无法处理该问题 【参考方案1】:

您的触发器已损坏(如评论所示),因为您假设只有一行正在更新/插入。但 SQL Server 触发器作用于 sets 行,而不是单个行。

我认为您可以将逻辑替换为:

UPDATE el 
    SET rig_ident = rl.ident
    FROM engineer_log el JOIN
         rig_log rl
         ON rl.rig_id = el.rig_id JOIN
         inserted i
         ON i.rig_id = rl.rig_id
    WHERE rig_id = @rigNum;

【讨论】:

以上是关于更新触发器后不更新 SQL 表中的特定数据行的主要内容,如果未能解决你的问题,请参考以下文章

触发器中的 ORACLE SQL 更新语句在 2 行后不起作用

插入后使用 SQL Server 触发器更新另一个表中的列

SQL Server 触发器插入/更新特定列

Oracle 触发器检查一个表中的课程持续时间,如果课程是特定日期,则阻止更新

当我调用触发器更新 STUDENT 表中的总数时,Oracle 中的 SQL 出错

SQL Server 删除触发器以更新同一表中的多个列