Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server创建审核触发器_Sql_Sql Server 2008_Triggers - Fatal编程技术网

SQL Server创建审核触发器

SQL Server创建审核触发器,sql,sql-server-2008,triggers,Sql,Sql Server 2008,Triggers,我需要为表更改创建审核记录。我正在读下面的答案: 我的审核表包含以下列: 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 -

我需要为表更改创建审核记录。我正在读下面的答案:

我的审核表包含以下列:

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_字段的格式如下:

column_name + chr(1) + old_value + chr(1) + new_value + chr(10) ...
这可以通过触发器实现吗?具体实现方式如何

编辑:

我的触发器基于以下答案:


如果我使用相同的表,触发器工作正常。但是,如何以所需格式连接更改的字段,并在审核表中仅插入一条记录?

下面是使用
而不是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