【问题标题】:SQL AFTER INSERT,UPDATE Trigger with condition if update specific columnSQL AFTER INSERT,UPDATE 如果更新特定列,则触发条件
【发布时间】:2019-06-06 11:28:28
【问题描述】:

我想创建一个触发器,在 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

【问题讨论】:

    标签: sql-server tsql database-trigger


    【解决方案1】:

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

    通常最好使用deleted 并比较以前/当前的值:

    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
    

    这里我假设 a) ID 代表表的不可变主键,b) FK2 不能为空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多