如何在 SQL Server 的触发器中获取多个字段的旧值和新值?

Posted

技术标签:

【中文标题】如何在 SQL Server 的触发器中获取多个字段的旧值和新值?【英文标题】:How to get old value and new value of multiple field in trigger in SQL server? 【发布时间】:2020-09-07 00:50:48 【问题描述】:

我有一张桌子Person

CREATE TABLE Person
(
    ID INT PRIMARY KEY,
    FirstName varchar(50),
    LastName varchar(50),
    Phone varchar(50),
    Address varchar(50),
    City varchar(50),
    PinCode varchar(50),
    DateOfBirth DATETIME,
    UpdatedOn DATETIME,
    UpdatedBy varchar(50)
)

每当我插入或更新上表中的多个字段时,我都想要所有更新字段的先前值和当前值,并使用触发器将其存储在另一个表中。我们如何获取所有更新字段的值。

例如

INSERT INTO Person 
VALUES (1, 'first', 'last', '11111', 'add', 'city', 'pin', GETDATE(), GETDATE(), 'ABC')

UPDATE Person
SET FirstName = 'First11', 
    LastName = 'Last22', 
    Phone = '1010101010'
WHERE id = 1

当我在两种情况下都使用上述命令时,我想要旧值和当前值并将其存储在另一个表中。我们如何使用触发器来实现这一点?

【问题讨论】:

简单 - 在AFTER INSERT 触发器上写入,另一个AFTER UPDATE - 请参阅the official MS docs 了解如何执行此操作 【参考方案1】:

对于你更新时的SQL Server(他删除旧值然后插入新值)

   ALTER TRIGGER [dbo].[YOUR_TRIGGER_NAME_INSERT]
   ON  [dbo].[YOUR_TABLE] 
   AFTER INSERT --Here when you insered rows
   AS 
   BEGIN
        select * from inserted --get all inserted rows  
        --Your code
   END

然后更新

   ALTER TRIGGER [dbo].[YOUR_TRIGGER_NAME_UPDATE] 
   ON  [dbo].[YOUR_TABLE] 
   AFTER UPDATE--Here when you updated rows
   AS 
   BEGIN
        select * from inserted --get all inserted (new values) rows 
        select * from deleted--get all deleted (old values) rows    
        --Your code
   END

【讨论】:

以上是关于如何在 SQL Server 的触发器中获取多个字段的旧值和新值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL server 建立的触发器子查询返回值不唯一,需要用多个返回值如何操作

插入前的 SQL Server 触发器

在 SQL Server 中获取触发器的调用者

如何在sql server中获取更新的列名

Sql Server 2005 - 插入更新触发器 - 获取更新,插入行

在 SQL Server 中使用基于多个字段的自动序列创建触发器