2013-02-18 76 views
0

我在SQL表上有一個觸發器設置用於審計跟蹤目的。 這裏是觸發代碼。SQL查詢獲取使用ASP.NET觸發器中的服務器名稱

ALTER TRIGGER [dbo].[tri_bowzer_UPDATE] ON [dbo].[Bowzer] 
For Update 
AS 
    INSERT Table_Audit(TableName, Action, UserName, ComputerName) 
     SELECT 
      'bowzer', 'U', suser_sname(), host_name() 

它工作正常,並在桌面應用程序中顯示用戶名和計算機(客戶端)名稱。但在ASP.NET應用程序中,我使用通用SQL登錄名,以便可以使用此登錄名執行數據庫操作。據我所知,由於這個ID,SQL Server正在獲取服務器機器名稱。但是,我希望在執行數據庫操作時捕獲客戶機名稱。

獲取客戶機名稱可以進行哪些更改?

回答

0

您需要調整您的連接字符串如下

string strconn = "data source=SQLSERVER;initial catalog = DBNAME ; uid=sa;pwd=password; WSID=" + (System.Net.Dns.GetHostEntry(Request.ServerVariables["remote_addr"]).HostName); 

指定ConnectionString屬性WSID(工作站ID),然後你會得到你的觸發

MSDN HOST_NAME()值作爲客戶端計算機名稱: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx

+0

需要注意的是,在任何合理繁忙的網站上,這將爆炸正在使用的連接數,因爲每個用戶的連接字符串是不同的,因此它們最終位於單獨的連接池中。 – 2013-02-18 07:41:33

+0

我該寫remote_addr嗎?或將其更改爲服務器名稱? – 2013-02-18 07:42:26

+0

我的連接字符串是在web.config中定義的,如下所示: 2013-02-18 07:44:16

0

您可以使用T-SQL SET CONTEXT_INFO設置客戶端的IP地址,並使用CONTEXT_INFO函數在觸發器中檢索此數據。

+0

我可以有一些示例代碼嗎? – 2013-02-19 04:29:39

0

這種設計並不適合你想要達到的目的。我會考慮在數據庫中添加按列更新,您可以在其中存儲更新數據的用戶的用戶標識或計算機名稱。

通過這種方式,您可以保持觸發邏輯的簡單性並避免連接到數據庫的太多可能會降低性能的連接。

+0

你能分享一些代碼嗎? – 2013-02-19 04:29:20