1

有没有办法在用户不处于系统管理员角色或被授予查看服务器状态的情况下获取连接的 IP 地址?发出此查询需要其中之一:

select client_net_address from sys.dm_exec_connections where session_id = @@spid

我想在一个替代触发器中记录 IP 地址,但我不想向所有用户授予 VIEW SERVER STATE 权限。

感谢您的任何建议。


跟进 2013-10-05:感谢您的各种评论。将 VIEW SERVER STATE 授予所有用户有什么危险?

4

2 回答 2

1

您可以将触发器设置为以所有者身份执行:

ALTER TRIGGER dbo.whatever_instead
ON dbo.whatever
WITH EXECUTE AS OWNER
INSTEAD OF INSERT
AS
BEGIN
  SET NOCOUNT ON;

  INSERT dbo.log_table(column1, ...)
  SELECT client_net_address, ...
    FROM sys.dm_exec_connections 
    WHERE session_id = @@SPID;

  ... other stuff here I'm sure ...
END
GO

但是,默认情况下,您应该收到以下错误:

消息 15562,级别 16,状态 1,过程whatever_instead
正在执行的模块不受信任。要么需要授予模块数据库的所有者身份验证权限,要么需要对模块进行数字签名。该语句已终止。

解决此问题的一种方法是将数据库设置为TRUSTWORTHY

ALTER DATABASE database_name SET TRUSTWORTHY ON;

不要掉以轻心:

于 2013-10-04T22:16:02.350 回答
-1
CREATE PROCEDURE Some_Proc
WITH EXECUTE AS 'User_With_Permission'
AS
BEGIN 
    SET NOCOUNT ON;
        select client_net_address from sys.dm_exec_connections where session_id = @@spid
END

从您的触发器调用此过程

于 2013-10-04T22:01:32.170 回答