如何设置通用触发器来设置审计字段?

时间:2016-06-17 23:01:16

标签: sql sql-server audit sql-server-2016

我想在我的表上自动设置审计字段(UpdatedBy / UpdatedOn)。为此,我在每个表上都有一个触发器,如下所示:

CREATE TRIGGER [dbo].[tr_AsyncMessage_Upd] ON [dbo].[AsyncMessage] AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;

    UPDATE m
    SET 
       m.UpdatedOn = CURRENT_TIMESTAMP 
      ,m.UpdatedBy = SUSER_SNAME()
    FROM dbo.AsyncMessage m
    INNER JOIN inserted AS i 
    ON m.AsyncMessageID = i.AsyncMessageID

END

但是,我宁愿不必为每个表写一个触发器。有没有办法告诉SQL Server为我自动设置它们?或者有没有办法让一个触发器覆盖所有表格?

2 个答案:

答案 0 :(得分:2)

尝试这样的事情。复制此输出,并在运行之前检查它。这仅在表具有主键并且具有updatedby和updatedon列时才有效。

SELECT 'CREATE TRIGGER tr_'+TABLE_NAME+'_Update ON '+TABLE_SCHEMA+'.'+TABLE_NAME+' 
        AFTER UPDATE
        AS
        BEGIN
            UPDATE T SET UPDATEDBY=SYSTEM_USER, UPDATEDON=CURRENT_TIMESTAMP
            FROM '+TABLE_SCHEMA+'.'+TABLE_NAME+' T
            JOIN inserted I ON T.'+COLUMN_NAME+'=I.'+COLUMN_NAME+'
        END'

FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE CU
WHERE OBJECTPROPERTY(OBJECT_ID(CONSTRAINT_SCHEMA + '.' + CONSTRAINT_NAME), 'IsPrimaryKey') = 1
AND EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C WHERE C.COLUMN_NAME='UpdatedOn' AND CU.TABLE_NAME=C.TABLE_NAME)
AND EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS C2 WHERE C2.COLUMN_NAME='UpdatedBy' AND CU.TABLE_NAME=C2.TABLE_NAME)

答案 1 :(得分:1)

Sql不是C#,不要试图像对待它一样对待它。在C#中,什么是好的做法不一定是SQL中的好习惯。 SQL是声明性的,并且通常同时修改多个表的能力有限。

只需在每个表中写一次触发器,如果​​你为很多表执行此操作,然后编写为您编写触发器的内容,然后运行结果。

相关问题