【问题标题】:Recording info in SQL Server trigger在 SQL Server 触发器中记录信息
【发布时间】:2018-06-25 13:02:59
【问题描述】:

我有一个名为dsReplicated.matDB 的表和一个名为fee_earner 的列。当该列更新时,我想记录两条信息:

  • dsReplicated.matDB.mt_code
  • dsReplicated.matDB.fee_earner

fee_earner 已更新的行开始。

我已经掌握了在更新列时执行某些操作的基本语法,但需要掌握上述内容才能完成此操作。

ALTER TRIGGER [dsReplicated].[tr_mfeModified] 
ON [dsReplicated].[matdb]
AFTER UPDATE
AS 
BEGIN
    IF (UPDATE(fee_earner))
    BEGIN
        print 'Matter fee earner changed to '
    END 
END

【问题讨论】:

  • 另外,触发器中的 UPDATE 函数不关心值是否改变,只关心列是更新语句的一部分。

标签: sql-server tsql triggers


【解决方案1】:

SQL Server 中触发器的问题在于它们被称为每个 SQL 语句一个——而不是每行一次。因此,如果您的UPDATE 语句更新了 10 行,则您的触发器被称为 once,并且触发器内的 InsertedDeleted 伪表每个都包含 10 行数据。

为了查看fee_earner 是否发生了变化,我建议使用这种方法而不是UPDATE() 函数:

ALTER TRIGGER [dsReplicated].[tr_mfeModified] 
ON [dsReplicated].[matdb]
AFTER UPDATE
AS 
BEGIN
    -- I'm just *speculating* here what you want to do with that information - adapt as needed!
    INSERT INTO dbo.AuditTable (Id, TriggerTimeStamp, Mt_Code, Old_Fee_Earner, New_Fee_Earner)
        SELECT
            i.PrimaryKey, SYSDATETIME(), i.Mt_Code, d.fee_earner, i.fee_earner
        FROM Inserted i
        -- use the two pseudo tables to detect if the column "fee_earner" has 
        -- changed with the UPDATE operation
        INNER JOIN Deleted d ON i.PrimaryKey = d.PrimaryKey 
                             AND d.fee_earner <> i.fee_earner
END

Deleted 伪表包含值之前 UPDATE - 这就是为什么我将d.fee_earner 作为审计表中Old_Fee_Earner 列的值。 p>

Inserted 伪表包含UPDATE 之后的值 - 这就是为什么我从该Inserted 伪表中取出其他值以插入到审计表中。 p>

请注意,您确实必须在该表中有一个 不可更改 主键才能使此触发器起作用。对于 SQL Server 中的任何数据表,这是推荐的最佳做法。

【讨论】:

  • 感谢这绝对精彩 - 事实上,插入和删除伪表的概念对我来说是全新的,所以我真的不明白它是如何工作的,直到我真正尝试了一下.真的很高兴再次感谢。
猜你喜欢
  • 1970-01-01
  • 2017-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-31
相关资源
最近更新 更多