2017-01-11 22 views
3

是否有可能獲取有關修改歷史表中的數據的用戶/連接的信息?我閱讀了可以使用時態表的審計場景,並且可以檢測到誰更改了數據。但我該怎麼做?SQL Server 2016 - 時態表 - 如何識別用戶

+1

這不是真的用於審計。如果你仔細想想,當用戶修改一行時,基表中的行就是用戶改變的行。因此,您無法捕獲導致創建歷史記錄行的用戶的用戶名,他們可能正在更新我昨天更新的行,因此移動到歷史記錄表的行代表了我昨天所做的更改。所以你需要在基表中有一個使用觸發器更新的列,但是這會創建歷史記錄行的兩個版本(一個包含以前的編輯器,另一個包含新的編輯器)。 –

+0

不,你不能用INSTEAD OF觸發器偷偷溜走。我嘗試了它,並且有一個漏洞,但是[我報告了它,並且他們修復了它](https://connect.microsoft.com/SQLServer/feedback/details/2769923/can-easily-work-around-instead-的觸發 - 限制性上 - 時間表)。 –

+0

Thx提示。我閱讀這篇德文/英文msdn文章https://msdn.microsoft.com/en-us/library/mt631669.aspx 數據審計 「在存儲您需要保留的關鍵信息的表上使用臨時系統版本控制跟蹤什麼發生了變化,什麼時候發生,什麼時候發生***,以及在任何時候執行數據取證。「 我現在使用一個用戶列和cdc的解決方案。我認爲我可以用臨時表替換這個解決方案。但看起來我必須等待下一次更新。 – user1481065

回答

2

在時態表的當前實現中,它只記錄基於時間的信息,而沒有其他關於進行更改的會話。不要因爲我有某種內幕知識而認爲這種說法可能會改變這種情況;我對此一無所知。如果你需要這些信息,你需要將它記錄下來。一個經典的方法是使用觸發器來觸發DML操作並代表用戶維護該值。

0

我正在考慮解決此問題的另一個選擇是在保存或更新行時填充基本時態表中的LastModifiedBy字段。

這將顯示誰修改了表並創建了歷史記錄。就像上面提到的Aaron一樣,你可以在觸發器中做到這一點,但我的想法是在更新插入/更新之前決定它,並在記錄更新時將值放入LastModifiedBy字段中。

每當記錄被修改時,這也會出現在歷史記錄表中。

+0

如果他們可以控制通過存儲過程進行的所有數據訪問和/或可以訪問發佈更新的應用程序代碼,則這將起作用。許多人不能。 –

+2

我使用LastModifiedBy字段並利用新的_SESSION_CONTEXT_特性製作了(尚未生產就緒)解決方案。 我在打開連接時設置的值爲'SESSION_CONTEXT('UserID')'的字段上創建了默認約束。它工作正常,但如果有人明確指出該值,則可以被覆蓋。 –

2

我的解決方案不需要觸發器。我在主表中有一個總是包含登錄用戶的計算列,例如,

CREATE TABLE dbo.Employees(
    EmployeeID INT NOT NULL, 
    FirstName sysname NOT NULL, 
    ValidFrom DATETIME2(7) GENERATED ALWAYS AS ROW START NOT NULL, 
    ValidTo DATETIME2(7) GENERATED ALWAYS AS ROW END NOT NULL, 
    LoggedInUser AS (SUSER_SNAME()), --<<-- computed column 

...等

領域LoggedInUser總是包含在每個記錄當前登錄的用戶名稱,並在任何時間的變化是因此保存到歷史表使任何記錄。

當然,這在主表中並不是很有用,因爲它沒有顯示誰對每條記錄進行了最後一次更改。 但是在歷史表中,它在變化發生時被凍結,這非常有用(儘管它在期末記錄用戶,而不是開始)。

請注意,作爲計算列,LoggedInUser必須可以爲空,因此歷史記錄表中的相應列也必須是可以爲空的。

主(電流)表: Main table

歷史表: History table

當然,在歷史表,它記錄了誰從改變記錄這種狀態下,不那個狀態,即在有效期結束時登錄的用戶。它也適用於刪除操作,但SQL Server臨時表系統不會在歷史記錄表中插入記錄來插入。

任何關於如何改善這一點的想法都是值得歡迎的,例如,如何記錄誰在歷史表中的每個有效期的開始處進行了更改。我有一個想法涉及主表中的另一個計算字段,該字段使用UDF來獲取在歷史記錄表中進行最後更改的用戶。

編輯:我從@Aaron Bertrand的優秀文章here中發現了很多靈感,它使用了一個觸發器。

+0

Thx分享您的解決方案,這對我來說非常有用。 – user1481065