使用一个侦听多个表更新的SQL Server触发器

时间:2016-04-19 15:31:19

标签: sql-server triggers

我有一个包含多个表的Microsoft SQL Server 2012数据库。

所有表格包含相同的两列DataRowModified(类型datetime)和DataRowLastAuthor(类型nvarchar(MAX))。不,我不能将所有这些列放在一个单独的表中,而是要求每个表直接包含这些行。

我为表Events编写了下面的触发器,以便在行更新时自动更新这两列的值:

CREATE TRIGGER [dbo].[Trigger_Events_UpdateMetadata]
    ON [dbo].[Events]
    FOR UPDATE
    AS
    BEGIN
        UPDATE [dbo].[Events] 
        SET [DataRowModified] = GETDATE(),
            [DataRowLastAuthor] = ORIGINAL_LOGIN()
        WHERE [Id] IN (SELECT [Id] FROM INSERTED)
    END

现在我的问题是我是否必须为每个必须使用它的表复制(并重命名)此触发器,或者我可以以某种方式编写一个适用于所有(或指定的一组)表的全局触发器?它必须知道更新发生在哪个表/行中,因为它必须修改它。

如上所述,将自动维护的LastAuthorLastModificationDate列实施到多个表中的最简单方法是什么?

1 个答案:

答案 0 :(得分:1)

SQL Server中的触发器始终绑定到单个表 - 您不能拥有" global"一次附加到多个表的触发器或触发器。

如果你需要在50个表上触发 - 你需要写50个触发器,每个表一个。没办法解决这个问题。

避免这种情况的唯一方法是更新应用程序数据库层中的那些列,以便在保存数据行时这些值已经存在。像实体框架这样的东西允许这样的"批量操作"在例如多个实体上更新上次修改日期和最后一个用户修改实体。