2

Windows7ボックスでSQLServer2008R2を使用しています。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 に答える