在 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
最好的方法是比较 Inserted
和 Deleted
伪 table。在 AFTER UPDATE
触发器中,Deleted
伪 table 包含旧值,而 Inserted
包含新值。因此,如果 Deleted.acceptanceState
与 Inserted.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
我有以下 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
最好的方法是比较 Inserted
和 Deleted
伪 table。在 AFTER UPDATE
触发器中,Deleted
伪 table 包含旧值,而 Inserted
包含新值。因此,如果 Deleted.acceptanceState
与 Inserted.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