2016-12-02 70 views
0

我在我的Datamart中有一張桌子;用戶應該只從該表中讀取...我查了一下,桌子的數量下降了,也就是說,某人,SP或工作人員刪除了記錄,我感覺這不是第一次。如何追蹤未來的刪除?

我的問題:什麼是侵入性更小,更簡單的跟蹤方式:我不想阻止這種情況;我想得到這個人的名字,或者SP/Job的名字,以及它發生的確切時間。

我使用:的Microsoft SQL Server 2012(SP1) - 11.0.3000.0(X64):商業智能版在Windows NT 6.2(64位)(編譯9200:)(管理程序)

我有'簡單的'恢復模式,我假設過去追蹤它是非常具有挑戰性的,所以我很高興在將來檢索這些信息。

+1

打開CDC(取決於您的SQL Server版本)或添加觸發器。如果你已經發布了SQL Server登錄,那麼可能無法找出它的真實身份。如果您使用的是Windows身份驗證,那麼您有更好的機會 –

+0

這是[SQL Server審覈](https://msdn.microsoft.com/en-us/library/cc280386.aspx)的工作,自2008年起可用。選項是啓用更改跟蹤,它比CDC更輕,並且可用於所有SQL Server版本。雖然 –

+0

我沒有看到相同的信息,但我看到cdc不會爲您提供在特定表格上刪除一行的確切登錄名或sp/job。我能做到這一點的唯一方法就是用我想到的觸發器。我試圖找到一個例子。 「 – Chicago1988

回答

0

您可以在表中使用AFTER DELETE觸發器和日誌中刪除值到歷史記錄表與用戶信息和刪除時間等如下

CREATE TRIGGER dbo.myTableDeleteTrigger 
    ON dbo.myTable 
AFTER DELETE 
AS 

    INSERT INTO myTableHistory (
    -- columns from myTable 
    DeletedDate, 
    DeletedByUserId 
) 
    SELECT 
    -- delete column values from Deleted temp table 
    GETDATE(), 
    USER_ID() 
    FROM Deleted 

GO 

我使用了類似的trigger to log data changes,用於在SQL數據庫表中插入,更新和刪除DML,如我在參考教程中所述

+0

偉大的答案!我使用了USER_ID(),並且我在表格中插入了'11'...不確定這是一個人還是一份工作......我怎麼能確切知道誰是'11'? – Chicago1988

0

以下代碼將爲您數據庫中的每個表生成觸發器。

注意:您可以排除那些你不想在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))