触发另一个触发器后启用触发器

时间:2014-09-25 20:39:16

标签: sql sql-server triggers

我是触发器的新手,我处于一个必须使用它们的位置。我有一个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语句现在会立即自动触发更新触发器。

如果由另一个触发器执行,是否有办法禁用更新触发器?或者只在创建记录后启用更新触发器?

1 个答案:

答案 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