在没有VIEW SERVER STATE权限的情况下获取SQL Server中的连接IP地址?

时间:2013-10-04 21:45:40

标签: sql-server ip-address

有没有办法在用户不在SysAdmin角色或被授予VIEW SERVER STATE的情况下获取连接的IP地址?发出此查询需要其中一个:

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

我想在反向触发器内记录IP地址,但我不想向所有用户授予VIEW SERVER STATE权限。

感谢您的任何建议。


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

2 个答案:

答案 0 :(得分: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

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

  

Ms 15562,Level 16,State 1,Procedure whatever_instead   
正在执行的模块不受信任。需要为模块的数据库所有者授予身份验证权限,或者需要对模块进行数字签名。   声明已经终止。

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

ALTER DATABASE database_name SET TRUSTWORTHY ON;

请勿轻易接受此设置:

答案 1 :(得分:-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

从触发器调用此proc