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

问题描述 投票:0回答:8

我有一个插入/更新/删除触发器。效果很好。另外,我需要进行更改的客户端的 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 .net sql sql-server sql-server-2008
8个回答
52
投票

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

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

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

另请参阅这篇关于 获取客户端 IP 地址

的文章

41
投票

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

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 

11
投票

最终连接两个系统表:

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'))

4
投票

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

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

参考: https://learn.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()
);  

1
投票

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

你最好坚持

SELECT SERVERPROPERTY(N'MachineName');

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


0
投票

试试这个

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

select @IP_Address;

0
投票

Windows Server 2019 中,使用以下查询来检索客户端 IP 地址信息:

SELECT session_id, client_net_address
    FROM sys.dm_exec_connections

结果:

欲了解更多详情:

SELECT   
    Clients.session_id AS SessionId , Clients.net_transport AS NetTransport,
    Clients.auth_scheme As AuthScheme, Clients.encrypt_option AS EncryptOption, 
    Servers.host_name AS HostName, Servers.nt_domain AS Domain,
    Servers.program_name As ProgramName, Servers.login_name AS LoginName,
    Servers.nt_user_name AS NtUserName,  Servers.original_login_name AS OriginalLoginName,
    Servers.client_interface_name AS ClientInterfaceName, Servers.status AS ServerStatus,
    Clients.connect_time AS ClientConnectTime, Servers.login_time   
FROM sys.dm_exec_connections AS Clients  
JOIN sys.dm_exec_sessions AS Servers
    ON Clients.session_id = Servers.session_id 

结果:

© www.soinside.com 2019 - 2024. All rights reserved.