我有一个插入/更新/删除的触发器。这工作正常。此外,我需要客户端的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
我很想知道:
这里的net_address是什么?是MAC地址还是某些IP地址等?
有没有办法将net_address转换为ip?
谦逊的请求:
在回答/评论/ downvoting之前,我会要求您首先彻底解决问题。我发现有些人在没有正确处理问题的情况下进行了评论/评论。没有问题,每个人都会犯错误。但不是每次都犯错误。 :)
答案 0 :(得分:37)
我找到了可能对你有用的东西
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 :(得分:24)
您可以尝试this solution。它甚至适用于共享托管:
select CONNECTIONPROPERTY('client_net_address') AS client_net_address
答案 2 :(得分:6)
最终加入两个系统表:
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
答案 3 :(得分:5)
它只需要一行代码
SELECT CONVERT(char(15), CONNECTIONPROPERTY('client_net_address'))
答案 4 :(得分:1)
我无法获得确切的数字IP地址,而是因为上述语句的限制而获得了NULL值。限制是,如果您通过TCP / IP连接,则只能获得IP地址。如果您是本地人并使用共享内存,那么这些属性就不存在了。如果您通过服务器配置管理器关闭共享内存(或除TCP / IP之外的任何协议),您将始终获得任何连接的IP地址。
你最好坚持
SELECT SERVERPROPERTY(N'MachineName');
...代替数字IP地址。
答案 5 :(得分:0)
试试这个
DECLARE @IP_Address varchar(255);
SELECT @IP_Address = client_net_address
FROM sys.dm_exec_connections
WHERE Session_id = @@SPID;
select @IP_Address;
答案 6 :(得分:0)
下面的查询返回客户端机器(不是服务器)的 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()
);