SQL AFTER INSERT,UPDATE如果更新特定列则触发条件

时间:2019-01-11 14:15:05

标签: sql-server tsql database-trigger

我想创建一个触发器,该触发器可以在FREE03上插入后将新数据集插入到FREE08表中(请参见示例代码)。这部分有效。但是我也想仅在更新FREE03的特定列(FK2)时才将新数据集插入FREE08。认为这可以与触发器中的“ IF UPDATE(FK2)语句一起使用”。 发生什么情况是,每次我在FREE03中进行任何更新时,我都会在FREE08中获得一个新的数据集。 我该怎么办?

感谢您的支持

   USE [DB]
    GO

    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    CREATE TRIGGER [dbo].[Einsatzhistorie Wechsler] 
       ON  [dbo].[FREE03]
       AFTER INSERT,UPDATE
    AS
      SET NOCOUNT ON;

      IF UPDATE(FK2)

    BEGIN

                            INSERT INTO FREE08
    (
    FK1,FK2,TEXT3,DATE1,TEXT2,DATE4
    ) 
    Select FK2,FK1,ID,DATE1,TEXT1,DATE11 From inserted 
                end

1 个答案:

答案 0 :(得分:0)

我从未发现UPDATE函数的真正用途,因为它告诉您某列是否受UPDATE 的影响(即出现在{{1 }}子句),而不是数据是否实际更改。另外,当然,触发器会每条语句触发一次,而不是每行触发一次,因此您的触发器可能正在处理混合的行,其中某些更改了其SET,而有些则没有

通常最好使用FK2并比较先前/当前的值:

deleted

在这里,我假设a)CREATE TRIGGER [dbo].[Einsatzhistorie Wechsler] ON [dbo].[FREE03] AFTER INSERT,UPDATE AS SET NOCOUNT ON; INSERT INTO FREE08 ( FK1,FK2,TEXT3,DATE1,TEXT2,DATE4 ) Select i.FK2,i.FK1,i.ID,i.DATE1,i.TEXT1,i.DATE11 From inserted i left join deleted d on i.ID = d.ID and i.FK2 = d.FK2 where d.ID is null 代表表的不可变主键,b)ID不可为空。