如何制作通用触发器来设置审核字段



我想在表上自动设置审核字段(更新/更新)。为此,我在看起来像这样的每个桌子上都有一个触发器:

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自动为我设置它们?还是有一种方法可以覆盖所有表?

尝试这样的东西。复制其输出,然后在运行之前对其进行检查。这仅在表具有主键,并且具有更新和更新列的情况下才起作用。

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)

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

只需每张表触发一次,如果您要为很多表进行此操作,然后写一些为您写触发器的东西,然后运行结果。

相关内容

  • 没有找到相关文章

最新更新