簡體   English   中英

如何從 SQL Server 2008 本身獲取客戶端 IP 地址?

[英]How to get the client IP address from SQL Server 2008 itself?

我有一個插入/更新/刪除的觸發器。 那工作正常。 另外,我需要進行更改的客戶端的 IP 地址。 我需要在 T-SQL 中,這意味着,不是在任何網絡表單中,而是在 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?

我找到了可能對你有用的東西

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

您可以試試這個解決方案 它甚至適用於共享主機:

select CONNECTIONPROPERTY('client_net_address') AS client_net_address 

最終加入兩個系統表:

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

它只需要一行代碼

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

由於上述語句的限制,我無法獲得確切的數字 IP 地址,而是獲得了 NULL 值。 限制是如果您通過 TCP/IP 連接,您只能獲得 IP 地址。 如果您在本地並使用共享內存,則這些屬性不存在。 如果您通過服務器配置管理器關閉共享內存(或除 TCP/IP 之外的任何協議),您將始終獲得任何連接的 IP 地址。

你最好堅持

SELECT SERVERPROPERTY(N'MachineName');

...它可以代替數字 IP 地址。

嘗試這個

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

select @IP_Address;

下面的查詢返回客戶端機器(不是服務器)的 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()
);  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM