Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新后触发器不更新SQL表中的特定数据行_Sql_Sql Server_Triggers_Sql Update - Fatal编程技术网

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

更新后触发器不更新SQL表中的特定数据行,sql,sql-server,triggers,sql-update,Sql,Sql Server,Triggers,Sql Update,这里对SQL相当陌生。。。我正在尝试在SQL Server中获取“更新后”触发器,以便在更新另一列(rig_id)时更新该列(rig_id)rig_ident 下面的代码可以运行,但我担心它可能会遍历表中的每一行并进行相应的检查,这将浪费处理和时间!有人能就如何正确地做到这一点提供建议吗 ALTER TRIGGER engineer_log_onUpdate_trig ON engineer_log AFTER UPDATE AS BEGIN SET NOCOUNT ON;

这里对SQL相当陌生。。。我正在尝试在SQL Server中获取“更新后”触发器,以便在更新另一列(
rig_id
)时更新该列(
rig_id
)<通过搜索
rig_log
表,可以找到code>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
您的触发器已断开(如注释所示),因为您假设只更新/插入了一行。但是SQL Server触发器在行集合上工作,而不是在单个行上工作

我认为您可以用以下内容替换逻辑:

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;

您假设触发器将仅触发1行,这是不正确的。插入的
和删除的
表可能包含多行。你的扳机不能处理这个问题