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

이 항목은 다음에 적용됩니다.예SQL Server(2008부터)예Azure SQL Database아니요Azure SQL Data Warehouse 아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure 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_variablevarbinary(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

1.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 문에 @cookie 문의 EXECUTE AS 변수로 전달되는 값을 지정해야 합니다.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. 이 예를 실행하려면 예 1에서 생성된 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

EXECUTE AS(Transact-SQL) 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)