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

时间:2013-02-21 22:58:47

标签: sql-server-2008-r2 impersonation

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

CREATE PROCEDURE dbo.ImpersonateUser
AS
BEGIN
EXECUTE AS USER = 'UserName';
END

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

PRINT CURRENT_USER;

EXEC ImpersonateUser;

PRINT CURRENT_USER

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

dbo
dbo

......当我想要它时......

dbo
UserName

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

2 个答案:

答案 0 :(得分:7)

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

除了过程范围之外的其他事情是使用SET命令和#TempObjects进行更改。

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

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

答案 1 :(得分:2)

塞巴斯蒂安的回答是正确的,但你仍然必须授予用户调用模仿权。 Syntax can be found here

GRANT IMPERSONATE ON LOGIN::[login_to_be_impersonated] to [login1];
GO