使用存储过程"执行用户"并应用于调用上下文(会话)

Hyd*_*per 2 impersonation sql-server-2008-r2

我在Windows 7机器上使用SQL Server 2008 R2.我创建了一个存储过程来运行SQL命令EXECUTE AS USER:

CREATE PROCEDURE dbo.ImpersonateUser
AS
BEGIN
EXECUTE AS USER = 'UserName';
END
Run Code Online (Sandbox Code Playgroud)

然后,我试图看看我是否冒充了用户......

PRINT CURRENT_USER;

EXEC ImpersonateUser;

PRINT CURRENT_USER
Run Code Online (Sandbox Code Playgroud)

......结果是......

dbo
dbo
Run Code Online (Sandbox Code Playgroud)

......当我希望它......

dbo
UserName
Run Code Online (Sandbox Code Playgroud)

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

Seb*_*ine 7

这不可能.任何EXECUTE AS更改都会在过程结束时自动恢复.

其他不超出过程范围的事情是使用SET命令和#TempObjects进行更改.

但是,您可以做的是封装需要在过程中的不同安全上下文下执行的逻辑,然后从更改上下文的过程中调用该逻辑.就像是:

CREATE PROCEDURE dbo.CallWithImpersonateUser
   @ProcedureName
AS
BEGIN
  EXECUTE AS USER = 'UserName';
  EXEC @ProcedureName;
END;
Run Code Online (Sandbox Code Playgroud)