如何从SQL Server 2008本身获取客户端IP地址?

28 .net sql sql-server asp.net sql-server-2008

我有一个插入/更新/删除触发器.这工作正常.此外,我需要客户端的IP地址来进行更改.我需要在T-SQL中,这意味着,不是在任何Web表单中,而是在SQL/T-SQL中,而我的触发器将被触发.

我也去了,并得到了master数据库中存储的程序xp_cmdshell,当执行时ipconfig我们可以得到IP地址.我认为这只有在您拥有数据库的管理权限时才有效.我的托管是一个共享托管,所以我没有这样的特权.还有其他出路吗?

请帮忙

提前致谢

请注意:我的SQL Server 2008数据库没有管理权限.我需要一个经过身份验证的用户的解决方案.

另一个更新:

我有解决方案,对我的方案有用的查询是

SELECT hostname, net_library, net_address
FROM sys.sysprocesses 
WHERE spid = @@SPID
Run Code Online (Sandbox Code Playgroud)

它根据需要执行,但只有一个问题,即net_address不是IP格式.以下是我的结果:

hostname    net_library     net_address
IPC03       TCP/IP          AE8F925461DE  
Run Code Online (Sandbox Code Playgroud)

我很想知道:

  1. 什么是net_address?是MAC地址还是某些IP地址等?

  2. 有没有办法将net_address转换为ip?

谦虚的要求:

在回答/评论/ downvoting之前,我会要求你首先彻底解决这个问题.我发现有些人在没有正确处理问题的情况下进行了评论/评论.没有问题,每个人都会犯错误.但不是每次都犯错误.:)

huM*_*pty 39

我发现了一些可能对你有用的东西

CREATE FUNCTION [dbo].[GetCurrentIP] ()
RETURNS varchar(255)
AS
BEGIN
    DECLARE @IP_Address varchar(255);

    SELECT @IP_Address = client_net_address
    FROM sys.dm_exec_connections
    WHERE Session_id = @@SPID;

    Return @IP_Address;
END
Run Code Online (Sandbox Code Playgroud)

如何在SQL Server中获取客户端IP地址

另请查看有关获取客户端IP地址的这篇文章

  • 嗨,似乎查询很好,但我收到一条错误消息 - 用户没有权限执行此操作.同样的情况来到这里..我没有管理员权限 (2认同)
  • @AmitRanjan 从`sys.dm_exec_connections` 中选择需要`VIEW SERVER STATE` 权限 http://msdn.microsoft.com/en-us/library/ms181509.aspx (2认同)
  • 正如@AmitRanjan 指出的那样,此方法需要访问 sys.dm_exec_connections 的权限,而用户可能没有。使用下面 Dmitry 推荐的 select CONNECTIONPROPERTY('client_net_address') (2认同)

小智 27

你可以尝试这个解决方案.它甚至适用于共享主机:

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 
Run Code Online (Sandbox Code Playgroud)

  • 链接表示您可以使用`CONNECTIONPROPERTY('local_net_address')AS local_net_address`以及许多其他CONNECTIONPROPERTY变量. (2认同)
  • 这是一个更好的解决方案,因为它不需要读取sys.dm_exec_connections的权限 (2认同)

Pie*_*rre 6

最终加入两个系统表:

SELECT  hostname,
        net_library,
        net_address,
        client_net_address
FROM    sys.sysprocesses AS S
INNER JOIN    sys.dm_exec_connections AS decc ON S.spid = decc.session_id
WHERE   spid = @@SPID
Run Code Online (Sandbox Code Playgroud)

输出:

hostname | net_library | net_address | client_net_address    
PIERRE   | TCP/IP      | 0090F5E5DEFF| 10.38.168.5
Run Code Online (Sandbox Code Playgroud)


Suk*_*ala 6

它只需要一行代码

 SELECT CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
Run Code Online (Sandbox Code Playgroud)