我在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
是否可能影响调用上下文(会话)?我想在存储过程中封装(和隐藏)其他逻辑。
答案 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