我是触发器的新手,我处于一个必须使用它们的位置。我有一个azure数据库,在表上有两个触发器,一个在插入,一个在更新。
插入:将记录插入表格时触发。将一列复制到另一列:
CREATE TRIGGER [dbo].[tr_Set_Adjusted_StartDateTime]
ON [dbo].[Work]
AFTER INSERT
AS
BEGIN
UPDATE dbo.Work
SET [ActualStartDateTime] = [work].[StartDateTime]
FROM inserted
WHERE dbo.Work.WorkUID = inserted.WorkUID;
END
更新触发器(记录更新时触发):
CREATE TRIGGER [dbo].[tr_Set_Actual_EndDateTime]
ON [dbo].[Work]
AFTER UPDATE
AS
IF((Select [ActualEndDateTime] from Deleted) is null)
BEGIN
UPDATE dbo.Work
SET [ActualEndDateTime] = GETUTCDATE()
FROM deleted
WHERE dbo.Work.WorkUID = deleted.WorkUID;
END
第二个触发器应该只执行一次:第一次更新记录。因为插入记录的存储过程不会填充所有列。
第二个触发器最初没有IF语句。但是有一个管理站点可以操作数据库并引发更新触发器。
IF语句现在会立即自动触发更新触发器。
如果由另一个触发器执行,是否有办法禁用更新触发器?或者只在创建记录后启用更新触发器?
答案 0 :(得分:0)
如果您在表上有After Update触发器,则每次该表上有更新时都会触发。你不能告诉触发只有一次火。
但是有一种解决方法。您可以在该表中添加一个字段BIT
字段,并将其值设置为触发器中的1
,切勿直接操作此字段。在你的UPDATE触发器
UPDATE w
SET [ActualEndDateTime] = GETUTCDATE()
,[Tr_Update] = 1
FROM deleted d INNER JOIN dbo.Work w ON w.WorkUID = d.WorkUID
WHERE [Tr_Update] = 0
AND [ActualEndDateTime] IS NULL
在旁注上,您正在检查用户是否未将当前日期时间添加到[ActualEndDateTime]
列。如果您只是使用WHERE子句[ActualEndDateTime] IS NULL执行上述语句,那么这是一个更新后的触发器,
当第一次和第二次更新行时,它会将[ActualEndDateTime]
更新为当前日期时间,因为[ActualEndDateTime]
字段不为空,它只会将其过滤掉。
UPDATE w
SET [ActualEndDateTime] = GETUTCDATE()
FROM deleted d INNER JOIN dbo.Work w ON w.WorkUID = d.WorkUID
WHERE [ActualEndDateTime] IS NULL