我需要为表更改创建一个审计记录。我看到了下面的答案:SQL插入/更新/删除触发效率
我的审计表有以下列:
audit_id
audit_date
audit_user
audit_table_name -> table name being audited
audit_table_id -> id of the row being audited
audit_parent_name -> parent table name if this table is a child
audit_parent_id -> parent id (is a foreign key in this table)
audit_type -> insert, update, delete
audit_fields -> all fields that were affected
比较棘手的部分是audit_fields的格式如下:
column_name + chr(1) + old_value + chr(1) + new_value + chr(10) ...
这可以通过触发器实现吗?具体如何实现?
编辑:我的触发器基于以下答案:SQL Server自动审计已更新的列
如果我使用相同的表,触发器工作正常。但是,如何以所需的格式连接已更改的字段,并在审计表中只插入1条记录呢?
下面是使用INSTEAD OF UPDATE
触发器捕获列的前后值并将其存储到另一个表的简单示例。
IF OBJECT_ID('dbo.test1') IS NOT NULL DROP TABLE test1
IF OBJECT_ID('dbo.test2') IS NOT NULL DROP TABLE test2
CREATE TABLE Test1 ( Id INT, value VARCHAR(20) )
GO
CREATE TABLE Test2 (TableName VARCHAR(100), ValueChanged VARCHAR(250) )
GO
CREATE TRIGGER test1_Update ON dbo.Test1
INSTEAD OF UPDATE
AS
INSERT INTO dbo.Test2
( TableName
,ValueChanged
)
SELECT 'Test1'
,'value' + ' ' + t.value + ' ' + i.value + ';'
FROM INSERTED AS i
JOIN Test1 AS t
ON i.id = t.id;
UPDATE dbo.Test1
SET value = INSERTED.value
FROM INSERTED
WHERE test1.Id = INSERTED.id
go
SELECT * FROM test1
INSERT INTO dbo.Test1 VALUES (1, 'Data'),(2,'Data')
SELECT * FROM test1
UPDATE test1
SET value = 'MyNew Data 1 '
WHERE id = 1
SELECT * FROM test1
SELECT * FROM test2