2

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

4

2 回答 2

7

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

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

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

CREATE PROCEDURE dbo.CallWithImpersonateUser
   @ProcedureName
AS
BEGIN
  EXECUTE AS USER = 'UserName';
  EXEC @ProcedureName;
END;
于 2013-02-22T00:11:37.867 回答
2

塞巴斯蒂安的回答是正确的,但您仍然必须授予模拟呼叫用户。 语法可以在这里找到

GRANT IMPERSONATE ON LOGIN::[login_to_be_impersonated] to [login1];
GO
于 2013-08-22T10:45:29.683 回答