REVERT (Transact-SQL)REVERT (Transact-SQL)

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

実行コンテキストを、最後の EXECUTE AS ステートメントの呼び出し元に戻します。Switches the execution context back to the caller of the last EXECUTE AS statement.

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

構文Syntax

  
REVERT  
    [ WITH COOKIE = @varbinary_variable ]  

引数Arguments

WITH COOKIE = @varbinary_variableWITH COOKIE = @varbinary_variable
対応するスタンドアロンの EXECUTE AS ステートメントで作成されたクッキーを指定します。Specifies the cookie that was created in a corresponding EXECUTE AS stand-alone statement. @varbinary_variable* は varbinary(100) です。@varbinary_variable* is varbinary(100).

RemarksRemarks

REVERT は、ストアド プロシージャまたはユーザー定義関数などのモジュール内、またはスタンドアロンのステートメントとして指定できます。REVERT can be specified within a module such as a stored procedure or user-defined function, or as a stand-alone statement. モジュール内で指定した場合、REVERT はモジュール内で定義された EXECUTE AS ステートメントにのみ適用されます。When specified inside a module, REVERT is applicable only to EXECUTE AS statements defined in the module. たとえば、次のストアド プロシージャでは、EXECUTE AS ステートメントの後に REVERT ステートメントが実行されます。For example, the following stored procedure issues an EXECUTE AS statement followed by a REVERT statement.

CREATE PROCEDURE dbo.usp_myproc   
  WITH EXECUTE AS CALLER  
AS   
    SELECT SUSER_NAME(), USER_NAME();  
    EXECUTE AS USER = 'guest';  
    SELECT SUSER_NAME(), USER_NAME();  
    REVERT;  
    SELECT SUSER_NAME(), USER_NAME();  
GO  

次の例のように、ストアド プロシージャが実行されるセッションで、セッションの実行コンテキストが明示的に login1 に変更されるとします。Assume that in the session in which the stored procedure is run, the execution context of the session is explicitly changed to login1, as shown in the following example.

  -- Sets the execution context of the session to 'login1'.  
EXECUTE AS LOGIN = 'login1';  
GO  
EXECUTE dbo.usp_myproc;   

この場合、usp_myproc 内で定義された REVERT ステートメントでは、モジュール内で設定されている実行コンテキストが切り替えられますが、モジュール外で設定されている実行コンテキストに影響はありません。The REVERT statement that is defined inside usp_myproc switches the execution context set inside the module, but does not affect the execution context set outside the module. つまり、セッションの実行コンテキストは login1 のままです。That is, the execution context for the session remains set to login1.

スタンドアロンのステートメントとして指定した場合、REVERT はバッチまたはセッション内で定義された EXECUTE AS に適用されます。When specified as a standalone statement, REVERT applies to EXECUTE AS statements defined within a batch or session. 対応する EXECUTE AS ステートメントに WITH NO REVERT 句が含まれている場合、REVERT は無効です。REVERT has no effect if the corresponding EXECUTE AS statement contains the WITH NO REVERT clause. この場合、実行コンテキストはセッションが削除されるまで有効です。In this case, the execution context remains in effect until the session is dropped.

セッションの実行コンテキストの設定に使われる EXECUTE AS ステートメントには、WITH NO REVERT COOKIE = @varbinary_variable 句を指定できます。The EXECUTE AS statement that is used to set the execution context of a session can include the optional clause WITH NO REVERT COOKIE = @varbinary_variable. このステートメントを実行すると、データベース エンジンDatabase Engineではクッキーが @varbinary_variable に渡されます。When this statement is run, the データベース エンジンDatabase Engine passes the cookie 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 correct *@varbinary_variable* value.

このメカニズムは、接続プールが使用される環境で役立ちます。This mechanism 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 across multiple end users. *@varbinary_variable* に渡される値は、EXECUTE AS ステートメントの呼び出し元 (この場合はアプリケーション) だけが認識できるため、呼び出し元が確立した実行コンテキストは、アプリケーションを呼び出すエンド ユーザーによって変更されることはありません。Because the value passed to *@varbinary_variable* is known only to the caller of the EXECUTE AS statement (in this case, the application), the caller can guarantee that the execution context they establish cannot be changed by the end user that invokes the application. 実行コンテキストが戻された後、アプリケーションではコンテキストを他のプリンシパルに切り替えることができます。After the execution context is reverted, the application can switch context to another principal.

アクセス許可Permissions

権限は必要ありません。No permissions are required.

使用例Examples

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

次の例では、複数のプリンシパルを使用してコンテキスト実行スタックを作成した後、The following example creates a context execution stack by 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 that 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 the current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
REVERT;  
-- Display the current execution context.  
SELECT SUSER_NAME(), USER_NAME();  
  
-- Remove the 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(100);  
EXECUTE AS USER = 'user1' WITH COOKIE INTO @cookie;  
-- Store the cookie somewhere safe 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(100);  
-- 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

実行 AS (& a) #40 です。TRANSACT-SQL と #41 です。 EXECUTE AS (Transact-SQL)
EXECUTE AS 句 (Transact-SQL) EXECUTE AS Clause (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
SUSER_NAME (Transact-SQL) SUSER_NAME (Transact-SQL)
USER_NAME (Transact-SQL) USER_NAME (Transact-SQL)
CREATE LOGIN (Transact-SQL) CREATE LOGIN (Transact-SQL)
CREATE USER (Transact-SQL)CREATE USER (Transact-SQL)