2017-06-01 81 views
0

當用戶「123」登錄到應用程序並對數據庫中的數據執行更改時,我希望完成此更改將記錄到具有「 123「在額外的列。SQL Server:根據應用程序用戶記錄數據庫更改

想法是編寫一個觸發器,在鏡像表中保存「插入」或「刪除」,但問題是應用程序總是使用相同的數據庫用戶,所以我需要將應用程序用戶與數據庫連接不知何故。

所以我的想法是當用戶登錄到應用程序時,將應用程序用戶的@@ SPID保存到表中。不幸的是,我發現@@ SPID對於每個查詢都是不同的,即使我使用相同的ADOConnection類。

我也無法使用應用程序名稱或主機名稱,因爲它可能是同一服務器上的不同用戶啓動相同的應用程序,我需要能夠區分第一個用戶所做的更改與第二個更改用戶確實。

該應用程序非常大,因此更新每個查詢以手動記錄更改現在不是一個選項。

這個問題還有其他解決方案嗎?

+0

類似於https://stackoverflow.com/questions/648166/how-to-get-windows-log-in-user-name-for-a-sql-log-in-user – PacoDePaco

+0

是你的usrs域用戶?您是否想知道使用SQL Server登錄(通過您的應用程序)登錄到服務器的用戶的域帳戶? – sepupic

回答

0

我現在實際上爲它找到了一個解決方案:使用host_process_id。

基本上,當應用程序用戶登錄時,可以將他連接到dm_exec_sessions系統表中的host_process_id。然後,當觸發器運行時,您可以從@@ SPID獲取host_process_id以查明哪個用戶執行了更改。

即使@@ SPID發生更改,host_process_id仍保持不變,但當同一應用程序在同一服務器上運行兩次時,它的值不同。

0

最好的方法是捕獲每個表中關於修改/插入/刪除記錄的用戶信息。當用戶對記錄進行更改時,將他的詳細信息(如ID)更新到「LastModifiedBy」列中。這應該解決捕獲用戶信息的問題.--因爲我沒有看到任何其他可能的方式,因此我們沒有看到任何其他可能的方式。對審計日誌記錄的簡單解決方案是在數據庫表上啓用SQL Change Data Capture。它將負責將審計信息記錄到由其創建的系統表中。但是請注意,CDC有一個保留期限,通常是3天。因此,每三天數據將從CDC表格中刪除。您可能希望探索禁用清理的機會,以便您可以將信息永久存儲在CDC表中,或者只需編寫.Net Windows服務或SSIS包以從CDC表中提取信息並推送到另一個審計數據庫。

相關問題