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

Posted

技术标签:

【中文标题】使用存储过程“以用户身份执行”并应用于调用上下文(会话)【英文标题】:Use Stored Procedure to "EXECUTE AS USER" and Apply to Calling Context (Session) 【发布时间】:2013-02-21 22:58:46 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

不超出该过程范围的其他内容是使用 SET 命令和#TempObjects 进行的更改。

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

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

【讨论】:

@Sebastian_Meine 感谢您的回答!【参考方案2】:

塞巴斯蒂安的回答是正确的,但您仍然必须授予模拟呼叫用户。 Syntax can be found here

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

【讨论】:

以上是关于使用存储过程“以用户身份执行”并应用于调用上下文(会话)的主要内容,如果未能解决你的问题,请参考以下文章

内联表值函数以“用户”身份执行

C#:加载漫游配置文件并以用户身份执行程序

mssql 存储过程调用另一个存储过程中的结果的方法分享

mssql 存储过程调用另一个存储过程中的结果的方法分享

Cron,以root身份执行bash脚本,但一部分(Python脚本)以用户身份执行

什么是存储过程?有什么优点?