更新触发器后不更新 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 行,但事实并非如此。inserted
和 deleted
表可能包含超过 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 行后不起作用
Oracle 触发器检查一个表中的课程持续时间,如果课程是特定日期,则阻止更新