Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取连接';没有查看服务器状态权限的SQL Server中的IP地址?_Sql Server_Ip Address - Fatal编程技术网

Sql server 获取连接';没有查看服务器状态权限的SQL Server中的IP地址?

Sql server 获取连接';没有查看服务器状态权限的SQL Server中的IP地址?,sql-server,ip-address,Sql Server,Ip Address,有没有一种方法可以在用户不处于SysAdmin角色或被授予查看服务器状态的情况下获取连接的IP地址?发出此查询需要以下条件之一: select client_net_address from sys.dm_exec_connections where session_id = @@spid 我想在Instead Of触发器中记录IP地址,但我不想授予所有用户查看服务器状态权限 谢谢你的建议 后续行动2013-10-05: 谢谢你的各种评论。将视图服务器状态授予所有用户有什么危险 CREATE

有没有一种方法可以在用户不处于SysAdmin角色或被授予查看服务器状态的情况下获取连接的IP地址?发出此查询需要以下条件之一:

select client_net_address from sys.dm_exec_connections where session_id = @@spid
我想在Instead Of触发器中记录IP地址,但我不想授予所有用户查看服务器状态权限

谢谢你的建议


后续行动2013-10-05: 谢谢你的各种评论。将视图服务器状态授予所有用户有什么危险

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

从触发器调用此过程

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

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
但是,默认情况下,您应该得到以下错误:

Msg 15562,16级,状态1,程序
正在执行的模块不受信任。需要授予模块数据库的所有者身份验证权限,或者需要对模块进行数字签名。 声明已终止

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

不要轻视此设置:


除非模块已签名或数据库设置为可信,否则仍会产生错误15562。因此,将其封装在存储过程中是一个额外且不必要的步骤。即使我们在登录时授予grant IMPERSONATE::[LOGIN_to_be_impersonated]给[login1];你试过了吗?你能提供一些代码来证明它的有效性吗?我自己刚试过,但它不起作用,很抱歉试图和你争论:我现在刚看到你的个人资料。好吧,我想在贴了这篇文章之后,至少我学到了一些东西。谢谢亚伦:)像蝴蝶一样漂浮,像甜菜丝一样刺人。看来我需要Trusty ON才能使用CLR UDF。
ALTER DATABASE database_name SET TRUSTWORTHY ON;