我目前正在使用此脚本向数据库中的所有表添加触发器:
exec sp_MSForEachTable 'CREATE TRIGGER [?_Update] ON ? FOR UPDATE AS
BEGIN SET NOCOUNT ON update ? set ModifiedOn = GETDATE() END'
我需要更改触发器,以便仅更新更改的行,因此它需要如下所示:
exec sp_MSForEachTable 'CREATE TRIGGER [?_Update] ON ? FOR UPDATE AS
BEGIN SET NOCOUNT ON update ? set ModifiedOn = GETDATE()
from ? updatedTable inner join inserted i
on i.[the tables primary key] = updatedTable.[the tables primary key]
END'
但是我不知道如何获取[表主键]值。由第一个脚本创建的触发器如下所示:
update [dim].[company] set ModifiedOn = GETDATE()
并假设我可以使第二个脚本工作,它将创建此触发器:
update [dim].[company] set ModifiedOn = GETDATE()
from [Dim].[Company] updatedTable
inner join inserted i on i.CompanyKey = updatedTable.CompanyKey
有谁知道如何执行此操作,或者是否不可能将所需的触发器添加到数据库中的所有表的替代方法?
最终目标是知道何时更改记录,最好是人类可读的记录,或者可以将其转换为人类可读的记录。我不知道更新的时间或位置,因此使用sprocs进行更新已经不存在了。
如果您的所有主键都是身份列,那么您可以作弊并使用IDENTITYCOL
“列”名称:
create table T (ID int IDENTITY(1,1) not null primary key,Col1 varchar(10) not null,Changed datetime null)
go
create trigger T_T
on T
after insert,update
as
update t set Changed = GETDATE()
from inserted i
inner join
T t on i.IDENTITYCOL = t.IDENTITYCOL
IDENTITYCOL
实际上是该表中标识列的任何列的自动别名。
实际上,可能首选$ identity:
update t set Changed = GETDATE()
from inserted i
inner join
T t on i.$identity = t.$identity
似乎IDENTITYCOL
已弃用。并不是说我实际上可以找到这两个文件的实际文档页面。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句