在 SQL Server 2008 中仅更新同一 table 中的特定列后更新触发器中的一列

Update one column in a trigger after updating only particular column in the same table in SQL Server 2008

我有以下 table 这种结构:

CREATE TABLE [dbo].[Tasks]
(
    [TasksID] [int] IDENTITY(1,1) NOT NULL,
    [CommitteeID] [int] NULL,
    [TransactionDateTime] [datetime2](7) NULL,
    [inspectionStatus] [nvarchar](50) NULL,
    [Latitude] [nvarchar](50) NULL,
    [Longitude] [nvarchar](50) NULL,
    [acceptanceState] [nvarchar](50) NULL,
    [comments] [nvarchar](350) NULL,
    [ScheduledDateTime] [datetime2](7) NULL,
)

我真正想要的是创建一个触发器,仅当更新 [acceptanceState] 列时,才使用当前日期时间更新 [TransactionDateTime]

我创建了以下触发器

CREATE TRIGGER [dbo].[TransactionDateUpdate]
ON [dbo].[Tasks]
AFTER UPDATE  
AS BEGIN
   UPDATE dbo.Tasks
   SET TransactionDateTime = GETDATE()
   FROM INSERTED i
   WHERE i.TasksID = Tasks.TasksID 
END

这个触发器的问题,它更新了列 [TransactionDateTime],但是如果我对 table 中的任何列进行了更改,我想要的是更新 [TransactionDateTime] ] 仅当列 [acceptanceState] 为 changed/updated 时。我能找到任何帮助吗?如何添加仅当[acceptanceState]为changed/updated时才更新[TransactionDateTime]的条件?

我搜索了很多类似的问题,但没有找到完全相同的问题。

您只需要在触发器中添加 IF UPDATE 检查并加入已删除 table:

CREATE TRIGGER [dbo].[TransactionDateUpdate]
ON [dbo].[Tasks]
AFTER UPDATE  
AS 
BEGIN
   IF UPDATE(acceptanceState)  --add this line
   UPDATE dbo.Tasks
   SET TransactionDateTime = GETDATE()
   FROM INSERTED i
   JOIN DELETED d on i.TasksID = d.TasksID --add this line
   WHERE i.TasksID = Tasks.TasksID 
END

最好的方法是比较 InsertedDeleted 伪 table。在 AFTER UPDATE 触发器中,Deleted 伪 table 包含旧值,而 Inserted 包含新值。因此,如果 Deleted.acceptanceStateInserted.acceptanceState 不同,则该列已更新。

所以你需要像这样稍微扩展你的触发器:

CREATE TRIGGER [dbo].[TransactionDateUpdate]
ON [dbo].[Tasks]
AFTER UPDATE  
AS BEGIN
   UPDATE dbo.Tasks
   SET TransactionDateTime = GETDATE()
   FROM Inserted i
   INNER JOIN Deleted d ON i.TasksID = d.TasksID
   WHERE i.TasksID = Tasks.TasksID 
     AND i.acceptanceState <> d.acceptanceState
END