2012-03-30 214 views
21

我有插入/更新/删除的触发器。这工作正常。另外,我需要客户的IP地址进行更改。我需要在T-SQL中,这意味着,不是以任何Web形式,而是在SQL/T-SQL中,而我的触发器将被解雇。如何从SQL Server 2008本身获取客户端IP地址?

另外我走了一步,并得到了主数据库中名为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吗?

小小的要求

接听/评论/ downvoting之前,我想请你去通过这个问题,第一,彻底。我发现有些人没有正确处理问题就发表评论/低调。没有问题,每个人都会犯错误。但并非每次都会犯错。 :)

+1

您提到您的数据库已托管,但该应用程序如何工作?在大多数ASP.NET应用程序中,用户连接到网站,然后网站连接到数据库。所以数据库服务器不知道谁是'真正'的最终用户。如果您可以提供一些关于您的应用程序以及用户如何连接到数据库的详细信息,则可能会有人提出建议。 – Pondlife 2012-03-30 10:35:39

+0

你可以在http://msdn.microsoft.com/en-us/library/ms179881.aspx找到关于** net_address **的详细信息 – 2012-03-30 14:40:18

回答

31

我发现了一些东西,可能为你工作

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

找到了,但是你用20秒赢了:) – 2012-03-30 10:23:31

+0

+1为你的诚意在SO上....保持它 – 2012-03-30 10:27:11

+2

嗨,似乎查询是好的,但我得到一个错误消息 - 用户没有执行此操作的权限。同样的情况出现在这里..我没有管理员权限 – 2012-03-30 10:28:51

20

您可以尝试this solution。它甚至在共享主机:

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 
+0

谢谢......它迟了,但我肯定会给它一个镜头...... – 2012-08-29 08:40:51

+2

链接表明你可以使用'CONNECTIONPROPERTY('local_net_address')AS local_net_address'作为一些其他CONNECTIONPROPERTY变量。 – Trisped 2014-11-06 01:37:33

+2

这是一个更好的解决方案,因为它不需要读取sys.dm_exec_connections的权限 – 2016-04-02 02:44:14

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 
4

它需要的代码只是一行

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

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

你最好用

SELECT SERVERPROPERTY(N'MachineName'); 

...它能够代替数字IP地址的行为卡住。