EXECUTE AS (Transact-SQL)EXECUTE AS (Transact-SQL)

適用対象: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) noParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

セッションの実行コンテキストを設定します。Sets the execution context of a session.

既定では、セッションはユーザーがログインしたときに開始し、ユーザーがログオフしたときに終了します。By default, a session starts when a user logs in and ends when the user logs off. セッション中のすべての操作で、ユーザーに対する権限の確認が行われます。All operations during a session are subject to permission checks against that user. EXECUTE AS ステートメントを実行するとき、セッションの実行コンテキストは指定したログインまたはユーザー名に切り替えられます。When an EXECUTE AS statement is run, the execution context of the session is switched to the specified login or user name. コンテキスト切り替えの後は、EXECUTE AS ステートメントを呼び出したログインまたはユーザーではなく、コンテキスト スイッチのアカウントに関連するログインとユーザーのセキュリティ トークンに対して権限の確認が行われます。After the context switch, permissions are checked against the login and user security tokens for that account instead of the person calling the EXECUTE AS statement. 実質的に、ユーザーまたはログイン アカウントは、セッションまたはモジュールの実行中、あるいはコンテキスト スイッチが明示的に戻されるまで続けて借用されます。In essence, the user or login account is impersonated for the duration of the session or module execution, or the context switch is explicitly reverted.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

{ EXEC | EXECUTE } AS <context_specification>  
[;]  
  
<context_specification>::=  
{ LOGIN | USER } = 'name'  
    [ WITH { NO REVERT | COOKIE INTO @varbinary_variable } ]   
| CALLER  

引数Arguments

LoginLOGIN
適用対象: SQL Server 2008SQL Server 2008 以降。Applies to: SQL Server 2008SQL Server 2008 and later.

権限を借用する実行コンテキストがログインであることを指定します。Specifies the execution context to be impersonated is a login. 権限借用のスコープはサーバー レベルです。The scope of impersonation is at the server level.

注意

このオプションは、包含データベース、SQL Database、SQL Data Warehouse では使用できません。This option is not available in a contained database or SQL Database or SQL Data Warehouse.

UserUSER
権限を借用するコンテキストが、現在のデータベース内のユーザーであることを指定します。Specifies the context to be impersonated is a user in the current database. 権限借用のスコープは、現在のデータベースに限定されます。The scope of impersonation is restricted to the current database. コンテキスト スイッチの対象がデータベース ユーザーであっても、そのユーザーのサーバー レベルの権限は継承されません。A context switch to a database user does not inherit the server-level permissions of that user.

重要

データベース ユーザーに対するコンテキスト スイッチがアクティブであるときに、データベース外部のリソースへアクセスを試みると、ステートメントが失敗する原因となります。While the context switch to the database user is active, any attempt to access resources outside of the database will cause the statement to fail. たとえば、USE database ステートメントや分散クエリ、3 部または 4 部構成の識別子を使用する別のデータベースを参照するクエリなどは実行しないでください。This includes USE database statements, distributed queries, and queries that reference another database that uses three- or four-part identifiers.

'name' は、有効なユーザー名またはログイン名です。'name' Is a valid user or login name. name は、sysadmin 固定サーバー ロールのメンバーであるか、sys.database_principals または sys.server_principals のプリンシパルとして存在する必要があります。name must be a member of the sysadmin fixed server role, or exist as a principal in sys.database_principals or sys.server_principals, respectively.

name はローカル変数として指定できます。name can be specified as a local variable.

name には単一アカウントを指定する必要があり、グループ、ロール、証明書、キー、NT AUTHORITY\LocalService、NT AUTHORITY\NetworkService、NT AUTHORITY\LocalSystem などのビルトイン アカウントにすることはできません。name must be a singleton account, and cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

詳しくは、後の「ユーザーまたはログイン名の指定」をご覧ください。For more information, see Specifying a User or Login Name later in this topic.

NO REVERTNO REVERT
コンテキスト スイッチを以前のコンテキストに戻せないことを示します。Specifies that the context switch cannot be reverted back to the previous context. NO REVERT オプションを使用できるのは、アドホック レベルでのみです。The NO REVERT option can only be used at the adhoc level.

以前のコンテキストに戻す方法について詳しくは、「REVERT (Transact-SQL)」をご覧ください。For more information about reverting to the previous context, see REVERT (Transact-SQL).

COOKIE INTO @varbinary_variableCOOKIE INTO @varbinary_variable
REVERT WITH COOKIE ステートメントの呼び出し時に適切な @varbinary_variable 値が含まれている場合にのみ、実行コンテキストを以前のコンテキストに戻すことができます。Specifies the execution context can only be reverted back to the previous context if the calling REVERT WITH COOKIE statement contains the correct @varbinary_variable value. データベース エンジンDatabase Engineでは、Cookie が @varbinary_variable に渡されます。The データベース エンジンDatabase Engine passes the cookie to @varbinary_variable. COOKIE INTO オプションを使用できるのは、アドホック レベルでのみです。The COOKIE INTO option can only be used at the adhoc level.

@varbinary_variablevarbinary(8000) です。@varbinary_variable is varbinary(8000).

注意

Cookie の OUTPUT パラメーターは現在、適切な最大長である varbinary(8000) としてドキュメントに記載されています。The cookie OUTPUT parameter for is currently documented as varbinary(8000) which is the correct maximum length. ただし、現在の実装では varbinary(100) を返します。However the current implementation returns varbinary(100). 将来のリリースでクッキーの戻り値のサイズが増えた場合にアプリケーションが引き続き正常に動作するように、アプリケーションでは varbinary(8000) を予約しておく必要があります。Applications should reserve varbinary(8000) so that the application continues to operate correctly if the cookie return size increases in a future release.

CALLERCALLER
モジュール内で使用した場合、モジュールの呼び出し元のコンテキストで、モジュール内のステートメントが実行されます。When used inside a module, specifies the statements inside the module are executed in the context of the caller of the module. モジュール外で使用した場合、このステートメントでは何も処理されません。When used outside a module, the statement has no action.

注意

SQL Data Warehouse では、このオプションは使用できません。This option is not available in SQL Data Warehouse.

RemarksRemarks

実行コンテキストでの変更は、次のいずれかが行われるまで有効です。The change in execution context remains in effect until one of the following occurs:

  • 別の EXECUTE AS ステートメントの実行Another EXECUTE AS statement is run.

  • REVERT ステートメントの実行。A REVERT statement is run.

  • セッションの停止The session is dropped.

  • コマンドが実行されたストアド プロシージャまたはトリガーの終了The stored procedure or trigger where the command was executed exits.

複数のプリンシパルで複数回、EXECUTE AS ステートメントを呼び出すと、実行コンテキストのスタックを作成できます。You can create an execution context stack by calling the EXECUTE AS statement multiple times across multiple principals. これを実行すると、REVERT ステートメントにより、コンテキスト スタックの次の上位レベルのログインまたはユーザーにコンテキストが切り替えられます。When called, the REVERT statement switches the context to the login or user in the next level up in the context stack. この動作のデモについては、「例 A」をご覧ください。For a demonstration of this behavior, see Example A.

ユーザーまたはログイン名の指定Specifying a User or Login Name

EXECUTE AS <context_specification> で指定するユーザーまたはログイン名は、それぞれ sys.database_principals または sys.server_principals のプリンシパルとして存在する必要があります。存在しない場合、EXECUTE AS ステートメントは失敗します。The user or login name specified in EXECUTE AS <context_specification> must exist as a principal in sys.database_principals or sys.server_principals, respectively, or the EXECUTE AS statement fails. さらに、プリンシパルで IMPERSONATE 権限が許可されている必要があります。Additionally, IMPERSONATE permissions must be granted on the principal. 呼び出し元がデータベース所有者または固定サーバー ロール sysadmin のメンバーでない場合は、ユーザーが Windows グループ メンバーシップによって SQL ServerSQL Server のデータベースやインスタンスにアクセスしているときでも、プリンシパルは存在する必要があります。Unless the caller is the database owner, or is a member of the sysadmin fixed server role, the principal must exist even when the user is accessing the database or instance of SQL ServerSQL Server through a Windows group membership. たとえば、次のような条件を想定します。For example, assume the following conditions:

  • CompanyDomain\SQLUsers グループに Sales データベースへのアクセス権がある。CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1SQLUsers のメンバーであり、したがって Sales データベースへのアクセスが暗黙的に許可されている。CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has implicit access to the Sales database.

この場合、CompanyDomain\SqlUser1SQLUsers グループのメンバーシップを介してデータベースにアクセスできますが、CompanyDomain\SqlUser1 がプリンシパルとしてデータベースに存在しないので、ステートメント EXECUTE AS USER = 'CompanyDomain\SqlUser1' は失敗します。Although CompanyDomain\SqlUser1 has access to the database through membership in the SQLUsers group, the statement EXECUTE AS USER = 'CompanyDomain\SqlUser1' fails because CompanyDomain\SqlUser1 does not exist as a principal in the database.

ユーザーが孤立した (関連付けられたログインが存在しない) 状態になり、かつユーザーが WITHOUT LOGIN で作成されなかった場合、そのユーザーに対する EXECUTE AS は失敗します。If the user is orphaned (the associated login no longer exists), and the user was not created with WITHOUT LOGIN, EXECUTE AS will fail for the user.

推奨事項Best Practice

セッションで操作を実行する場合に必要となる最低限の権限を持つログインまたはユーザーを指定します。Specify a login or user that has the least privileges required to perform the operations in the session. たとえば、データベース レベルの権限だけが必要な場合、サーバー レベルの権限が与えられているログイン名は指定しません。また、データベース所有者アカウントは、データベース レベルの権限が必要とされない場合は指定しません。For example, do not specify a login name with server-level permissions, if only database-level permissions are required; or do not specify a database owner account unless those permissions are required.

注意事項

EXECUTE AS ステートメントは、データベース エンジンDatabase Engineが名前を解決できる限り、正常に実行できます。The EXECUTE AS statement can succeed as long as the データベース エンジンDatabase Engine can resolve the name. ドメイン ユーザーが存在する場合、Windows ユーザーに データベース エンジンDatabase Engine へのアクセス権がなくても、SQL ServerSQL Serverのユーザーを解決できることがあります。If a domain user exists, Windows might be able to resolve the user for the データベース エンジンDatabase Engine, even though the Windows user does not have access to SQL ServerSQL Server. これにより、SQL ServerSQL Server へのアクセス権のないログインがログインしているように見える場合もありますが、権限借用したログインの権限が public または guest に付与されているだけの場合があります。This can lead to a condition where a login with no access to SQL ServerSQL Server appears to be logged in, though the impersonated login would only have the permissions granted to public or guest.

WITH NO REVERT の使用Using WITH NO REVERT

EXECUTE AS ステートメントにオプションの WITH NO REVERT 句が含まれている場合、REVERT を使用、または別の EXECUTE AS ステートメントを実行して、セッションの実行コンテキストを元に戻すことはできません。When the EXECUTE AS statement includes the optional WITH NO REVERT clause, the execution context of a session cannot be reset using REVERT or by executing another EXECUTE AS statement. ステートメントで設定されたコンテキストはセッションが削除されるまで有効です。The context set by the statement remains in affect until the session is dropped.

WITH NO REVERT COOKIE = @varbinary_variable 句を指定した場合、SQL Server データベース エンジンSQL Server Database Engineはクッキー値を @varbinary_variable に渡します。When the WITH NO REVERT COOKIE = @varbinary_variable clause is specified, the SQL Server データベース エンジンSQL Server Database Engine passes the cookie value to @varbinary_variable. そのステートメントで設定された実行コンテキストを以前のコンテキストに戻すことができるのは、REVERT WITH COOKIE = @varbinary_variable ステートメントの呼び出し時に、同じ *@varbinary_variable* 値が含まれている場合だけです。The execution context set by that statement can only be reverted to the previous context if the calling REVERT WITH COOKIE = @varbinary_variable statement contains the same *@varbinary_variable* value.

このオプションは、接続プールが使用されている環境で役立ちます。This option is useful in an environment in which connection pooling is used. 接続プールには、アプリケーション サーバーのアプリケーションで再利用できるよう、データベース接続のグループが保持されています。Connection pooling is the maintenance of a group of database connections for reuse by applications on an application server. *@varbinary_variable* に渡される値を認識できるのは EXECUTE AS ステートメントの呼び出し元のみであるため、呼び出し元が確立した実行コンテキストは、他のアカウントによって変更されることはありません。Because the value passed to *@varbinary_variable* is known only to the caller of the EXECUTE AS statement, the caller can guarantee that the execution context they establish cannot be changed by anyone else.

元のログインの特定Determining the Original Login

SQL ServerSQL Server のインスタンスに接続したログインの名前に戻すには、ORIGINAL_LOGIN 関数を使用します。Use the ORIGINAL_LOGIN function to return the name of the login that connected to the instance of SQL ServerSQL Server. この関数を使用すると、明示的または暗黙的にコンテキストが何度も切り替えられるセッションにおける、元のログインの ID を取得できます。You can use this function to return the identity of the original login in sessions in which there are many explicit or implicit context switches.

アクセス許可Permissions

ログインで EXECUTE AS を指定するには、呼び出し元に、指定のログイン名に対する IMPERSONATE 権限が与えられている必要があり、また IMPERSONATE ANY LOGIN 権限が拒否されていないことも条件となります。To specify EXECUTE AS on a login, the caller must have IMPERSONATE permission on the specified login name and must not be denied the IMPERSONATE ANY LOGIN permission. データベース ユーザーに EXECUTE AS を指定するには、呼び出し元に、指定のユーザー名に対する IMPERSONATE 権限が与えられている必要があります。To specify EXECUTE AS on a database user, the caller must have IMPERSONATE permissions on the specified user name. EXECUTE AS CALLER を指定した場合、IMPERSONATE 権限は必要ありません。When EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

使用例Examples

A.A. EXECUTE AS と REVERT を使用してコンテキストを切り替えるUsing EXECUTE AS and REVERT to switch context

次の例では、複数のプリンシパルを使用してコンテキスト実行スタックを作成した後、The following example creates a context execution stack using multiple principals. REVERT ステートメントを使用して実行コンテキストを以前のコンテキストに戻します。The REVERT statement is then used to reset the execution context to the previous caller. REVERT ステートメントは、実行コンテキストが最初の呼び出し元に設定されるまで、スタックの上層に向かって複数回実行されます。The REVERT statement is executed multiple times moving up the stack until the execution context is set to the original caller.

USE AdventureWorks2012;  
GO  
--Create two temporary principals  
CREATE LOGIN login1 WITH PASSWORD = 'J345#$)thb';  
CREATE LOGIN login2 WITH PASSWORD = 'Uor80$23b';  
GO  
CREATE USER user1 FOR LOGIN login1;  
CREATE USER user2 FOR LOGIN login2;  
GO  
--Give IMPERSONATE permissions on user2 to user1  
--so that user1 can successfully set the execution context to user2.  
GRANT IMPERSONATE ON USER:: user2 TO user1;  
GO  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
-- Set the execution context to login1.   
EXECUTE AS LOGIN = 'login1';  
--Verify the execution context is now login1.  
SELECT SUSER_NAME(), USER_NAME();  
--Login1 sets the execution context to login2.  
EXECUTE AS USER = 'user2';  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
-- The execution context stack now has three principals: the originating caller, login1 and login2.  
--The following REVERT statements will reset the execution context to the previous context.  
REVERT;  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
REVERT;  
--Display current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
  
--Remove temporary principals.  
DROP LOGIN login1;  
DROP LOGIN login2;  
DROP USER user1;  
DROP USER user2;  
GO  

次の例では、セッションの実行コンテキストを、指定したユーザーに設定し、WITH NO REVERT COOKIE = @varbinary_variable 句を指定します。The following example sets the execution context of a session to a specified user and specifies the WITH NO REVERT COOKIE = @varbinary_variable clause. コンテキストを正常に呼び出し元に戻すには、REVERT ステートメントで、EXECUTE AS ステートメントの @cookie 変数に渡される値を指定する必要があります。The REVERT statement must specify the value passed to the @cookie variable in the EXECUTE AS statement to successfully revert the context back to the caller. この例を実行するには、例 A で作成したログイン login1 とユーザー user1 が存在している必要があります。To run this example, the login1 login and user1 user created in example A must exist.

DECLARE @cookie varbinary(8000);  
EXECUTE AS USER = 'user1' WITH COOKIE INTO @cookie;  
-- Store the cookie in a safe location in your application.  
-- Verify the context switch.  
SELECT SUSER_NAME(), USER_NAME();  
--Display the cookie value.  
SELECT @cookie;  
GO  
-- Use the cookie in the REVERT statement.  
DECLARE @cookie varbinary(8000);  
-- Set the cookie value to the one from the SELECT @cookie statement.  
SET @cookie = <value from the SELECT @cookie statement>;  
REVERT WITH COOKIE = @cookie;  
-- Verify the context switch reverted.  
SELECT SUSER_NAME(), USER_NAME();  
GO  

参照See Also

REVERT (Transact-SQL) REVERT (Transact-SQL)
EXECUTE AS 句 (Transact-SQL)EXECUTE AS Clause (Transact-SQL)