以下代码将为您数据库中的每个表生成触发器。
注意:您可以排除那些你不想在CTE
;WITH CTE AS(
SELECT TAB.name FROM SYS.objects TAB
where TAB.type='U'
)
SELECT '
GO
CREATE TRIGGER [dbo].[TRG_'+NAME+'_LOG] ON [dbo].['+NAME+']
FOR UPDATE,DELETE
AS
INSERT INTO LOG_'+NAME+'
(LOG_DTE,'+(SELECT STUFF((
SELECT ', '+ COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=NAME FOR XML PATH('')),1,1,''))+')
SELECT getdate(),'+(SELECT STUFF((
SELECT ', '+ COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME=NAME FOR XML PATH('')),1,1,''))+'
from deleted
PRINT ''AFTER TRIGGER FIRED''
' FROM CTE order by name OFFSET 81 ROWS FETCH NEXT 571 ROWS ONLY
轨道表但你需要创建一个表与实际表的名称前缀LOG_每张桌子前。
例如:如果你有表Employee (Eid int, EName Varchar(250))
你需要有一个表像
Log_Employee (LOG_EID int identity,Log_DTe Datetime, EID int FK, EName Varchar(250))
打开CDC(取决于您的SQL Server版本)或添加触发器。如果你已经发布了SQL Server登录,那么可能无法找出它的真实身份。如果您使用的是Windows身份验证,那么您有更好的机会 –
这是[SQL Server审核](https://msdn.microsoft.com/en-us/library/cc280386.aspx)的工作,自2008年起可用。选项是启用更改跟踪,它比CDC更轻,并且可用于所有SQL Server版本。虽然 –
我没有看到相同的信息,但我看到cdc不会为您提供在特定表格上删除一行的确切登录名或sp/job。我能做到这一点的唯一方法就是用我想到的触发器。我试图找到一个例子。 “ – Chicago1988