比较 SQL Server 2008 中删除的表和插入的表

use*_*045 2 sql sql-server audit-trail sql-server-2008

我是 SQL Server 2008 的新手,需要大家的建议。我想找出一个表的 SQL Server 2008中的inserted和表中的更改值,因为我当前正在进行审计跟踪以保留旧值和新值。deleted如何循环所有列以找出删除和插入表中哪个字段的值发生变化?我尝试过 if else 语句进行比较

例如:

create trigger trg_XXX on dbo.table
after update
as
begin
    declare 
       @oldID varchar(6),
       @newID varchar(6)

    select @oldID = ID from deleted
    select @newID = ID from inserted

    if(@oldID != @newID)
       insert into table (a, b) values (@oldID, @newID)
    else
       print('do nothing')
Run Code Online (Sandbox Code Playgroud)

有没有办法使用游标循环删除和插入的表或任何替代方法?能给我一些例子吗?

Mit*_*dir 5

我不太确定你的目标是什么,我想可能是这样的。假设我们有一个这样的表:

CREATE TABLE Product
(
     ID      INT                   PRIMARY KEY,
     Name    NVARCHAR(100)         NOT NULL,
     Price   DECIMAL(10,2)         NOT NULL
);
Run Code Online (Sandbox Code Playgroud)

和一些像这样的审计表:

CREATE TABLE ProductAudit
(
     AuditID      INT                   IDENTITY PRIMARY KEY, 
     ProductID    INT                   NOT NULL
     OldName      NVARCHAR(100)         NULL,
     OldPrice     DECIMAL(10,2)         NULL,
     NewName      NVARCHAR(100)         NULL,
     NewPrice     DECIMAL(10,2)         NULL
);
Run Code Online (Sandbox Code Playgroud)

然后创建一个触发器:

CREATE TRIGGER TR_AUDIT
ON Product
FOR INSERT, UPDATE, DELETE
AS
BEGIN
       INSERT INTO ProductAudit (ProductID, OldName, OldPrice, NewName, NewPrice)
       SELECT 
           COALESCE(I.ID, D.ID),
           D.Name,
           D.Price,
           I.Name,
           I.Price
       FROM 
           INSERTED I FULL OUTER JOIN DELETED D ON I.ID = D.ID;
END
GO
Run Code Online (Sandbox Code Playgroud)

你有它。