【发布时间】:2015-05-04 19:19:51
【问题描述】:
我有下面这个结构的表格:
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,
)
我真正想要的是创建一个使用当前日期时间更新[TransactionDateTime] 的触发器,前提是更新了[acceptanceState] 列。
我创建了以下触发器
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],但是如果我对表中的任何列进行了更改,我想要的是仅在列[acceptanceState] 更改时更新[TransactionDateTime] /更新。我能找到任何帮助吗?仅当[acceptanceState]被更改/更新时,如何添加更新[TransactionDateTime]的条件?
我搜索了很多类似的问题,但没有找到完全相同的问题。
【问题讨论】:
-
您必须将已删除的表添加到您的查询中,并检查插入和删除的值是否不同。
-
另外我相信 SQL Server 有一个函数“IF UPDATE(ColumnName)”可以让你检查某个列是否被更新了。
-
@TabAlleman:不过,这将如何处理多行更新?
-
@TabAlleman 使用 UPDATE(ColumnName) 的一个问题是,如果该列包含在更新中,它会返回 true。它不考虑实际值。换句话说,即使新旧值相同,它也会返回 true。
-
True,@SeanLange,当列不可能发生变化时,IF UPDATE() 可用于使处理器免于执行查询,但它确实如您所说,如果返回 true该列包含在更新语句中,无论值是否更改。
标签: sql-server sql-server-2008 triggers updates