有没有办法在用户不在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的危险是什么?
答案 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