TSQL中After Update触发器的基本语法是:
CREATE TRIGGER [dbo].[triggerName]
ON [dbo].[Table]
AFTER UPDATE, INSERT --trigger when Update or Insert in table
AS BEGIN
SET NOCOUNT ON;
IF UPDATE (ColumnA) -- if ColumnA updates start
begin
UPDATE Table
SET ColumnC = ColumnA + ColumnB -- recalculate Column C
end
IF UPDATE (ColumnB) -- if ColumnB updates start
begin
UPDATE Table
SET ColumnC = ColumnA + ColumnB -- recalculate Column C
end
END
现在我觉得上面可以工作,但是可以将两个IF UPDATES合二为一起吗?: 像这样:
IF UPDATE (ColumnA) OR (ColumnB) -- if ColumnA or ColumnB updates start
begin
UPDATE Table
SET ColumnC = ColumnA + ColumnB -- recalculate Column C
end
当然,您可以使用计算列,但出于好奇,我想知道您是否可以在触发器中一次检查多列的更新,然后执行更新后触发器修改。
答案 0 :(得分:6)
评论时间有点长。
UPDATE()
是触发器中使用的函数。没有特定语法if UPDATE()
。据我所知,触发器允许您在if
语句中组合多个条件。
但是,更重要的是,请阅读UPDATE()
上的documentation。文档中使用的示例是:
IF ( UPDATE (StateProvinceID) OR UPDATE (PostalCode) )
BEGIN
RAISERROR (50009, 16, 10)
END;
所以,为你使用正确的语法,你会没事的:
IF UPDATE(ColumnA) OR UPDATE(ColumnB) -- if ColumnA or ColumnB updates start
begin
UPDATE Table
SET ColumnC = ColumnA + ColumnB -- recalculate Column C
end
但是,我建议你改用计算列。
答案 1 :(得分:2)
您可以使用COLUMNS_UPDATED
:
返回
varbinary
位模式,指示已插入或更新的表或视图中的列。
只需使用按位运算符检查您感兴趣的任何位:
IF (COLUMNS_UPDATED() & CAST(0x0A as int)) != 0
begin
--column 2 or 4 was updated
end
当然,这取决于列顺序,这通常是一个不好的依赖,如果稍后更改列顺序,它也不会爆炸。