更新后触发器不更新SQL表中的特定数据行
这里对SQL相当陌生。。。我正在尝试在SQL Server中获取“更新后”触发器,以便在更新另一列(更新后触发器不更新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;
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行,这是不正确的。插入的
和删除的表可能包含多行。你的扳机不能处理这个问题