我有一个包含多个表的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
现在我的问题是我是否必须为每个必须使用它的表复制(并重命名)此触发器,或者我可以以某种方式编写一个适用于所有(或指定的一组)表的全局触发器?它必须知道更新发生在哪个表/行中,因为它必须修改它。
如上所述,将自动维护的LastAuthor
和LastModificationDate
列实施到多个表中的最简单方法是什么?
答案 0 :(得分:1)
SQL Server中的触发器始终绑定到单个表 - 您不能拥有" global"一次附加到多个表的触发器或触发器。
如果你需要在50个表上触发 - 你需要写50个触发器,每个表一个。没办法解决这个问题。
避免这种情况的唯一方法是更新应用程序数据库层中的那些列,以便在保存数据行时这些值已经存在。像实体框架这样的东西允许这样的"批量操作"在例如多个实体上更新上次修改日期和最后一个用户修改实体。