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

时间:2012-03-30 10:16:15

标签: asp.net .net sql sql-server sql-server-2008

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

此外,我进行了调查,并得知在名为xp_cmdshell的主数据库中存储过程,当使用ipconfig执行时,我们可以获取IP地址。我认为这只有在您拥有数据库的管理访问权限时才有效。我的托管是一个共享托管,所以我没有这样的特权。还有其他出路吗?

请帮忙

提前致谢

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

另一次更新:

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

SELECT hostname, net_library, net_address
FROM sys.sysprocesses 
WHERE spid = @@SPID

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

hostname    net_library     net_address
IPC03       TCP/IP          AE8F925461DE  

我很想知道:

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

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

  3. 谦逊的请求

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

7 个答案:

答案 0 :(得分:37)

我找到了可能对你有用的东西

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

来自How to get Client IP Address in SQL Server

另请参阅有关Get client IP address

的这篇文章

答案 1 :(得分:24)

您可以尝试this solution。它甚至适用于共享托管:

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 

答案 2 :(得分: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

输出:

hostname | net_library | net_address | client_net_address    
PIERRE   | TCP/IP      | 0090F5E5DEFF| 10.38.168.5

答案 3 :(得分:5)

它只需要一行代码

 SELECT CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))

答案 4 :(得分:1)

我无法获得确切的数字IP地址,而是因为上述语句的限制而获得了NULL值。限制是,如果您通过TCP / IP连接,则只能获得IP地址。如果您是本地人并使用共享内存,那么这些属性就不存在了。如果您通过服务器配置管理器关闭共享内存(或除TCP / IP之外的任何协议),您将始终获得任何连接的IP地址。

你最好坚持

SELECT SERVERPROPERTY(N'MachineName');

...代替数字IP地址。

答案 5 :(得分:0)

试试这个

DECLARE @IP_Address varchar(255);
SELECT @IP_Address = client_net_address
FROM sys.dm_exec_connections
WHERE Session_id = @@SPID;

select @IP_Address;

答案 6 :(得分:0)

下面的查询返回客户端机器(不是服务器)的 IP 地址和工作站名称。

SELECT CONNECTIONPROPERTY('client_net_address') AS IpAddress,
       HOST_NAME() AS ClientMachineName

参考: https://docs.microsoft.com/en-us/sql/t-sql/functions/host-name-transact-sql?view=sql-server-ver15

示例

以下示例创建一个表,该表在 DEFAULT 定义中使用 HOST_NAME() 来记录将行插入到 orders 表中的计算机的工作站名称。

CREATE TABLE Orders_demo  
(
  OrderID     INT        PRIMARY KEY,  
  OrderDate   DATETIME   NOT NULL,
  Workstation NCHAR(30)  NOT NULL     DEFAULT HOST_NAME()
);