Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.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 2008 r2 使用存储过程来;“以用户身份执行”;并应用于调用上下文(会话)_Sql Server 2008 R2_Impersonation - Fatal编程技术网

Sql server 2008 r2 使用存储过程来;“以用户身份执行”;并应用于调用上下文(会话)

Sql server 2008 r2 使用存储过程来;“以用户身份执行”;并应用于调用上下文(会话),sql-server-2008-r2,impersonation,Sql Server 2008 R2,Impersonation,我正在Windows7上使用SQLServer2008R2。我创建了一个存储过程来运行SQL命令以用户身份执行: CREATE PROCEDURE dbo.ImpersonateUser AS BEGIN EXECUTE AS USER = 'UserName'; END 然后,我试着看看我是否在模仿用户 PRINT CURRENT_USER; EXEC ImpersonateUser; PRINT CURRENT_USER …结果是 dbo dbo …当我想要的时候 dbo User

我正在Windows7上使用SQLServer2008R2。我创建了一个存储过程来运行SQL命令
以用户身份执行

CREATE PROCEDURE dbo.ImpersonateUser
AS
BEGIN
EXECUTE AS USER = 'UserName';
END
然后,我试着看看我是否在模仿用户

PRINT CURRENT_USER;

EXEC ImpersonateUser;

PRINT CURRENT_USER
…结果是

dbo
dbo
…当我想要的时候

dbo
UserName

当然,这不起作用,因为
executeasuser
语句仅在存储过程
ImpersonateUser
中有效我的问题是:存储过程
ImpersonateUser
是否可能影响调用上下文(会话)?我想在存储过程中封装(并隐藏)其他逻辑。

这是不可能的。任何“执行为”更改都会在过程结束时自动恢复

使用SET命令和#TempObjects进行的更改不超过过程的范围

但是,您可以将需要在不同安全上下文下执行的逻辑封装到过程中,然后在更改上下文的过程中调用该逻辑。比如:

CREATE PROCEDURE dbo.CallWithImpersonateUser
   @ProcedureName
AS
BEGIN
  EXECUTE AS USER = 'UserName';
  EXEC @ProcedureName;
END;

Sebastian的回答是正确的,但您仍然必须为呼叫用户授予模拟。


@Sebastian_Meine谢谢你的回答!
GRANT IMPERSONATE ON LOGIN::[login_to_be_impersonated] to [login1];
GO