2008-11-27 45 views
12

因爲我們沒有在SQL服務器中以用戶的身份實現應用程序的用戶,所以當應用程序服務器連接到數據庫時,每個應用程序總是使用相同的憑證來附加到每個數據庫。SQL Server:修改用於審計目的的「應用程序名稱」屬性

這提出了審計問題。使用觸發器,我們希望存儲每個更新,插入和刪除,並將每個更新分配給特定用戶。一種可能的解決方案是爲每個表添加一個「由用戶更新」列並每次更新。這意味着每個表上的新列和每個存儲過程上的新參數。這也意味着你只能做軟刪除。

取而代之的是,我建議使用連接字符串的應用程序名稱屬性以及與扳機內APP_NAME()屬性閱讀本。我用一個簡單的應用測試了它,它似乎工作(格式可以如此:App = MyApp | User = 100)。

你們的問題是,這是一個壞主意,你有更好的嗎?

+0

你是如何解決這個問題的?您可以使用`CONTEXT_INFO`從觸發器讀取「App = MyApp | User = 100」?我需要修改* ApexSQL Audit 2008 *使用的觸發器,並存儲通過'ApplicationName'傳遞的「用戶」。 – AMissico 2013-07-27 01:32:00

回答

1

我們使用的應用程序名稱屬性來控制審計觸發器和使用它沒有看到任何問題,還沒有發現任何速度問題(雖然在我們的例子中,我們沒有專門審計對於某些應用,所以它的硬測量有多少時間沒有做的事情發生:))

+0

這很好聽。通過它的聲音,您每次都使用相同的應用程序名稱。我建議修改每個連接的應用程序名稱以標識當前用戶。你能看到這個問題嗎(我們沒有聯網)? – 2008-11-27 11:22:51

+0

我們使用兩個不同的應用程序名稱,一個用於我們想要審計的時間,一個用於我們不需要的時間(因爲無論使用的連接是手動處理審計)。 – 2008-11-27 21:25:48

2

這當然似乎是一個可行的解決方案,但你需要的用戶名注入到每一次的連接字符串您的應用程序加載。請注意,該解決方案可能不適用於Web應用程序,因爲每次連接字符串都會有所不同,這可能會導致巨大的連接池問題。

另一種方法是檢索主機名/ IP地址(SELECT host_name())並將其存儲。

你未必需要在每個存儲過程的新參數,你可以修改每個存儲過程(或觸發器)來自動插入APP_NAME /主機名。

一個潛在缺點是通過Management Studio中進行任何修改不會有自定義APP_NAME,你會留下「Microsoft管理工作室」作爲用戶。

+0

雖然我們曾經這樣做過,但我們不再使用連接池,因此每個連接都是獨立的。 主機名/ IP地址不起作用,因爲這將來自應用程序服務器而不是客戶端。 – 2008-11-27 12:59:58