2012-03-30 142 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地址的行爲卡住。

相關問題