2013-02-18 109 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