以下代碼將爲您數據庫中的每個表生成觸發器。
注意:您可以排除那些你不想在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