【问题标题】:How to make a generic trigger to set the audit fields?如何制作通用触发器来设置审计字段?
【发布时间】:2016-10-19 21:04:28
【问题描述】:

我想在我的表上自动设置审核字段 (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 为我自动设置它们?或者有没有办法让一个触发器覆盖所有表?

【问题讨论】:

  • 没有内置任何东西。不过,您可以通过编程方式生成所需的语句。
  • 您可以使用动态sql为多个表设置相同的触发器
  • 每个用户都使用不同的用户名吗?您使用的是 Win-Auth 还是 SQL Server 用户?
  • @FLICKER 我正在使用 SQL Server。是的,每个用户都有不同的用户名。
  • @tungula 如何获得涵盖多个表的触发器?

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


【解决方案1】:

试试这样的。复制它的输出,并在运行之前检查它。这仅在表具有主键并且具有 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)

【讨论】:

  • 是的,我知道...我已经做到了。对我来说,这闻起来不太对劲——为每个做同样事情的表设置一个触发器。无论如何,看看没有其他可行的选择 - 我将此答案标记为解决方案。
  • @AngryHacker;如果将此代码转换为存储过程,则每次创建表时都可以调用它。如果您随后创建一个每分钟运行此代码的 SQL 代理作业,那么您的所有表都会有一个触发器,除了您忘记的极少数表之外,然后只有一分钟。
【解决方案2】:

Sql 不是 C#,不要试图将其视为 C#。 C# 中的良好实践不一定是 SQL 中的良好实践。 SQL 是声明式的,通常同时修改多个表的能力有限。

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

【讨论】:

    猜你喜欢
    • 2020-10-26
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2014-04-19
    • 2018-11-03
    • 1970-01-01
    • 2014-04-14
    相关资源
    最近更新 更多