【问题标题】:How to get the client IP address from SQL Server 2008 itself?如何从 SQL Server 2008 本身获取客户端 IP 地址?
【发布时间】:2012-04-14 00:38:05
【问题描述】:

我有一个插入/更新/删除触发器。那工作正常。此外,我需要进行更改的客户端 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?

【问题讨论】:

  • 您提到您的数据库是托管的,但应用程序是如何工作的?在大多数 ASP.NET 应用程序中,用户连接到网站,然后网站连接到数据库。所以数据库服务器不知道“真正的”最终用户是谁或在哪里。如果您可以提供有关您的应用程序以及用户如何连接到数据库的更多详细信息,可能会有人提出建议。
  • 您可以在msdn.microsoft.com/en-us/library/ms179881.aspx 找到关于net_address的详细信息

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


【解决方案1】:

下面的查询返回 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() 来记录将行插入订单表的计算机的工作站名称。

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

【讨论】:

    【解决方案2】:

    试试这个

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

    【讨论】:

      【解决方案3】:

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

      你最好坚持

      SELECT SERVERPROPERTY(N'MachineName');
      

      ... 可以代替数字 IP 地址。

      【讨论】:

        【解决方案4】:

        你可以试试this solution。它甚至适用于共享主机:

        select CONNECTIONPROPERTY('client_net_address') AS client_net_address 
        

        【讨论】:

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

        最终连接两个系统表:

        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
        

        【讨论】:

          【解决方案6】:

          只需要一行代码

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

          【讨论】:

            【解决方案7】:

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

            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的文章

            【讨论】:

            • 找到了相同的结果,但您在 20 秒内获胜 :)
            • 嗨,似乎查询没问题,但我收到一条错误消息 - 用户无权执行此操作。同样的场景来到这里..我没有管理员权限
            • @AmitRanjan: 是你没有权限创建函数还是从sys.dm_exec_connections中选择?
            • @AmitRanjan 从sys.dm_exec_connections 中选择需要VIEW SERVER STATE 权限msdn.microsoft.com/en-us/library/ms181509.aspx
            • 正如@AmitRanjan 指出的那样,此方法需要访问 sys.dm_exec_connections 用户可能没有的权限。使用下面 Dmitry 推荐的 select CONNECTIONPROPERTY('client_net_address')
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-14
            • 2012-02-16
            • 2019-01-14
            • 1970-01-01
            • 2015-12-20
            • 2016-03-29
            • 1970-01-01
            相关资源
            最近更新 更多