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

SQL ServerSQL Server에서 사용자 정의 모듈인 함수(인라인 테이블 반환 함수 제외), 프로시저, 큐 및 트리거의 실행 컨텍스트를 정의할 수 있습니다.In SQL ServerSQL Server you can define the execution context of the following user-defined modules: functions (except inline table-valued functions), procedures, queues, and triggers.

모듈이 실행되는 컨텍스트를 지정해서 데이터베이스 엔진Database Engine 사용자 계정을 제어하면 모듈에서 참조하는 개체에 대한 사용 권한을 검사할 수 있습니다.By specifying the context in which the module is executed, you can control which user account the 데이터베이스 엔진Database Engine uses to validate permissions on objects that are referenced by the module. 이렇게 하면 사용자 정의 모듈 및 해당 모듈에서 참조하는 개체 사이에 있는 개체 체인에서 좀 더 유연하게 사용 권한 관리를 제어할 수 있습니다.This provides additional flexibility and control in managing permissions across the object chain that exists between user-defined modules and the objects referenced by those modules. 참조된 개체에 대한 명시적 사용 권한이 아닌 모듈 자체에 대한 사용 권한만 사용자에게 부여해야 합니다.Permissions must be granted to users only on the module itself, without having to grant them explicit permissions on the referenced objects. 모듈을 실행하고 있는 사용자만이 모듈에서 액세스하는 개체에 대한 사용 권한을 가져야 합니다.Only the user that the module is running as must have permissions on the objects accessed by the module.

항목 링크 아이콘 Transact-SQL 구문 규칙Topic link icon Transact-SQL Syntax Conventions

구문Syntax

-- SQL Server Syntax  
Functions (except inline table-valued functions), Stored Procedures, and DML Triggers  
{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }   

DDL Triggers with Database Scope  
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }   

DDL Triggers with Server Scope and logon triggers  
{ EXEC | EXECUTE } AS { CALLER | SELF | 'login_name' }   

Queues  
{ EXEC | EXECUTE } AS { SELF | OWNER | 'user_name' }   

-- Windows Azure SQL Database Syntax  
Functions (except inline table-valued functions), Stored Procedures, and DML Triggers  

{ EXEC | EXECUTE } AS { CALLER | SELF | OWNER | 'user_name' }   

DDL Triggers with Database Scope  

{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }  

인수Arguments

호출자에 게CALLER
모듈 내부의 문이 모듈 호출자의 컨텍스트에서 실행되도록 지정합니다.Specifies the statements inside the module are executed in the context of the caller of the module. 모듈을 실행하는 사용자는 모듈 자체에 대한 알맞은 사용 권한뿐만 아니라 모듈에서 참조하는 모든 데이터베이스 개체에 대한 사용 권한도 갖고 있어야 합니다.The user executing the module must have appropriate permissions not only on the module itself, but also on any database objects that are referenced by the module.

CALLER는 큐를 제외한 모든 모듈의 기본값이며 이것은 SQL Server 2005SQL Server 2005 동작과 동일합니다.CALLER is the default for all modules except queues, and is the same as SQL Server 2005SQL Server 2005 behavior.

CREATE QUEUE 또는 ALTER QUEUE 문에서는 CALLER를 지정할 수 없습니다.CALLER cannot be specified in a CREATE QUEUE or ALTER QUEUE statement.

자체SELF
EXECUTE AS SELF는 EXECUTE AS에 해당 user_name, 여기서 지정된 된 사용자가 만들거나 모듈을 변경 하는 사용자입니다.EXECUTE AS SELF is equivalent to EXECUTE AS user_name, where the specified user is the person creating or altering the module. 만들기 또는 모듈을 수정 하는 사용자의 실제 사용자 ID에 저장 됩니다는 execute_as_principal_id 열에는 sys.sql_modules 또는 sys.service_queues 카탈로그 뷰입니다.The actual user ID of the person creating or modifying the modules is stored in the execute_as_principal_id column in the sys.sql_modules or sys.service_queues catalog view.

SELF는 큐의 기본값입니다.SELF is the default for queues.

참고

사용자의 ID를 변경 하는 execute_as_principal_idsys.service_queues 카탈로그 뷰를 ALTER QUEUE 문에서 설정으로 EXECUTE를 명시적으로 지정 해야 합니다.To change the user ID of the execute_as_principal_id in the sys.service_queues catalog view, you must explicitly specify the EXECUTE AS setting in the ALTER QUEUE statement.

OWNEROWNER
모듈 내부의 문이 현재 모듈 소유자의 컨텍스트에서 실행되도록 지정합니다.Specifies the statements inside the module executes in the context of the current owner of the module. 모듈에 지정된 소유자가 없으면 이 모듈의 스키마 소유자를 사용합니다.If the module does not have a specified owner, the owner of the schema of the module is used. DDL 또는 로그온 트리거에 대해서는 OWNER를 지정할 수 없습니다.OWNER cannot be specified for DDL or logon triggers.

중요

OWNER는 단일 계정으로 매핑되어야 하며 역할이나 그룹이 될 수 없습니다.OWNER must map to a singleton account and cannot be a role or group.

' user_name '' user_name '
모듈 내부의 문이 지정 된 사용자의 컨텍스트에서 실행 되도록 지정 user_name합니다.Specifies the statements inside the module execute in the context of the user specified in user_name. 모듈 내의 모든 개체에 대 한 권한을 기준으로 확인 됩니다 user_name합니다.Permissions for any objects within the module are verified against user_name. user_name 서버 범위 또는 로그온 트리거에 DDL 트리거에 대 한 지정할 수 없습니다.user_name cannot be specified for DDL triggers with server scope or logon triggers. 사용 하 여 login_name 대신 합니다.Use login_name instead.

user_name 현재 데이터베이스에 존재 해야 하며 단일 계정 이어야 합니다.user_name must exist in the current database and must be a singleton account. user_name 그룹, 역할, 인증서, 키 또는 NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService 또는 NT AUTHORITY\LocalSystem 같은 기본 제공 계정이 될 수 없습니다.user_name cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

실행 컨텍스트의 사용자 ID 메타 데이터에 저장 되 고에서 볼 수는 execute_as_principal_id 열에는 sys.sql_modules 또는 sys.assembly_modules 카탈로그 뷰입니다.The user ID of the execution context is stored in metadata and can be viewed in the execute_as_principal_id column in the sys.sql_modules or sys.assembly_modules catalog view.

' login_name '' login_name '
모듈 내부의 문이 실행의 컨텍스트에서 지정 된 SQL ServerSQL Server 에 지정 된 로그인 login_name합니다.Specifies the statements inside the module execute in the context of the SQL ServerSQL Server login specified in login_name. 모듈 내의 모든 개체에 대 한 권한을 기준으로 확인 됩니다 login_name합니다.Permissions for any objects within the module are verified against login_name. login_name DDL 트리거 서버 범위 또는 로그온 트리거에 대해서만 지정할 수 있습니다.login_name can be specified only for DDL triggers with server scope or logon triggers.

login_name 그룹, 역할, 인증서, 키 또는 NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService 또는 NT AUTHORITY\LocalSystem 같은 기본 제공 계정이 될 수 없습니다.login_name cannot be a group, role, certificate, key, or built-in account, such as NT AUTHORITY\LocalService, NT AUTHORITY\NetworkService, or NT AUTHORITY\LocalSystem.

주의Remarks

데이터베이스 엔진Database Engine에서 모듈이 참조하는 개체에 대한 사용 권한을 평가하는 방법은 호출 개체와 참조된 개체 간에 존재하는 소유권 체인에 따라 다릅니다.How the 데이터베이스 엔진Database Engine evaluates permissions on the objects that are referenced in the module depends on the ownership chain that exists between calling objects and referenced objects. 이전 버전의 SQL ServerSQL Server에서 호출 사용자에게 참조된 모든 개체에 대한 액세스 권한을 부여하지 않도록 하는 유일한 방법은 소유권 체인이었습니다.In earlier versions of SQL ServerSQL Server, ownership chaining was the only method available to avoid having to grant the calling user access to all referenced objects.

소유권 체인에는 다음과 같은 제한 사항이 있습니다.Ownership chaining has the following limitations:

  • DML 문은에 적용 됩니다: 선택, 삽입, 업데이트 및 삭제 합니다.Applies only to DML statements: SELECT, INSERT, UPDATE, and DELETE.

  • 호출 개체의 소유자와 호출된 개체의 소유자가 동일해야 합니다.The owners of the calling and the called objects must be the same.

  • 모듈 내의 동적 쿼리에는 적용되지 않습니다.Does not apply to dynamic queries inside the module.

    다음 동작은 모듈에 지정된 실행 컨텍스트에 관계없이 항상 적용됩니다.Regardless of the execution context that is specified in the module, the following actions always apply:

  • 모듈이 실행될 때 데이터베이스 엔진Database Engine은 먼저 모듈을 실행하는 사용자에게 모듈에 대한 EXECUTE 권한이 있는지 확인합니다.When the module is executed, the 데이터베이스 엔진Database Engine first verifies that the user executing the module has EXECUTE permission on the module.

  • 소유권 체인 규칙은 지속적으로 적용됩니다.Ownership chaining rules continue to apply. 즉, 호출 개체의 소유자와 호출된 개체의 소유자가 동일한 경우 원본 개체에 대한 사용 권한을 확인하지 않습니다.This means if the owners of the calling and called objects are the same, no permissions are checked on the underlying objects.

    사용자가 CALLER 이외의 컨텍스트에서 실행되도록 지정된 모듈을 실행하는 경우 이 모듈을 실행하는 사용자의 사용 권한은 확인되지만 모듈이 액세스하는 개체에 대한 추가 사용 권한 확인은 EXECUTE AS 절에 지정된 사용자 계정에 대해 수행됩니다.When a user executes a module that has been specified to run in a context other than CALLER, the user's permission to execute the module is checked, but additional permissions checks on objects that are accessed by the module are performed against the user account specified in the EXECUTE AS clause. 결과적으로 모듈을 실행하는 사용자는 지정된 사용자를 가장하게 됩니다.The user executing the module is, in effect, impersonating the specified user.

    모듈의 EXECUTE AS 절에 지정된 컨텍스트는 모듈이 실행되는 동안에만 유효합니다.The context specified in the EXECUTE AS clause of the module is valid only for the duration of the module execution. 모듈 실행이 완료되면 컨텍스트는 호출자로 되돌아갑니다.Context reverts to the caller when the module execution is completed.

사용자 또는 로그인 이름 지정Specifying a User or Login Name

모듈이 다른 컨텍스트에서 실행되도록 수정하기 전에는 모듈의 EXECUTE AS 절에 지정된 데이터베이스 사용자나 서버 로그인을 삭제할 수 없습니다.A database user or server login specified in the EXECUTE AS clause of a module cannot be dropped until the module has been modified to execute under another context.

EXECUTE AS 절에 지정 된 사용자 또는 로그인 이름은에서 보안 주체로 존재 해야 sys.database_principals 또는 sys.server_principals, 각각 또는 다른 만들기 또는 모듈 작업이 실패 하면 변경 .The user or login name specified in EXECUTE AS clause must exist as a principal in sys.database_principals or sys.server_principals, respectively, or else the create or alter module operation fails. 또한 모듈을 만들거나 변경하는 사용자에게는 보안 주체에 대한 IMPERSONATE 권한이 있어야 합니다.Additionally, the user that creates or alters the module must have IMPERSONATE permissions on the principal.

사용자가 Windows 그룹 멤버 자격을 통해 SQL ServerSQL Server 데이터베이스나 인스턴스에 대한 암시적 액세스 권한을 갖고 있는 경우 다음 요구 사항 중 하나가 충족된다면 모듈이 생성될 때 EXECUTE AS 절에 지정된 사용자가 암시적으로 생성됩니다.If the user has implicit access to the database or instance of SQL ServerSQL Server through a Windows group membership, the user specified in the EXECUTE AS clause is implicitly created when the module is created when one of the following requirements exist:

  • 지정 된 사용자 또는 로그인의 멤버인는 sysadmin 고정된 서버 역할입니다.The specified user or login is a member of the sysadmin fixed server role.

  • 모듈을 만드는 사용자에게 보안 주체를 만들 사용 권한이 권한이 있습니다.The user that is creating the module has permission to create principals.

    이러한 요구 사항이 충족되지 않는 경우에는 모듈을 만들 수 없습니다.When neither of these requirements are met, the create module operation fails.

중요

SQL ServerSQL Server(MSSQLSERVER) 서비스가 로컬 서비스 또는 로컬 사용자 계정과 같은 로컬 계정으로 실행되고 있는 경우에는 EXECUTE AS 절에 지정된 Windows 도메인 계정의 그룹 멤버 자격을 가져올 수 있는 권한이 없습니다.If the SQL ServerSQL Server (MSSQLSERVER) service is running as a local account (local service or local user account), it will not have privileges to obtain the group memberships of a Windows domain account that is specified in the EXECUTE AS clause. 따라서 모듈 실행이 실패하게 됩니다.This will cause the execution of the module to fail.

예를 들어 다음과 같은 조건을 가정해 보세요.For example, assume the following conditions:

  • CompanyDomain\SQLUsers 그룹에 대 한 액세스는 Sales 데이터베이스입니다.CompanyDomain\SQLUsers group has access to the Sales database.

  • CompanyDomain\SqlUser1 의 멤버인 SQLUsers 따라서에 대 한 액세스 권한이 Sales 데이터베이스입니다.CompanyDomain\SqlUser1 is a member of SQLUsers and, therefore, has access to the Sales database.

  • 모듈을 만들거나 변경하는 사용자에게 보안 주체를 만들 사용 권한이 있습니다.The user that is creating or altering the module has permissions to create principals.

    다음 CREATE PROCEDURE 문을 실행하면 CompanyDomain\SqlUser1 데이터베이스에서 Sales이 데이터베이스 보안 주체로 암시적으로 생성됩니다.When the following CREATE PROCEDURE statement is run, the CompanyDomain\SqlUser1 is implicitly created as a database principal in the Sales database.

USE Sales;  
GO  
CREATE PROCEDURE dbo.usp_Demo  
WITH EXECUTE AS 'CompanyDomain\SqlUser1'  
AS  
SELECT user_name();  
GO  

EXECUTE AS CALLER 독립 실행형 문 사용Using EXECUTE AS CALLER Stand-Alone Statement

모듈 내에서 EXECUTE AS CALLER 독립 실행형 문을 사용하여 실행 컨텍스트를 모듈 호출자로 설정할 수 있습니다.Use the EXECUTE AS CALLER stand-alone statement inside a module to set the execution context to the caller of the module.

SqlUser2가 다음 저장 프로시저를 호출한다고 가정합니다.Assume the following stored procedure is called by SqlUser2.

CREATE PROCEDURE dbo.usp_Demo  
WITH EXECUTE AS 'SqlUser1'  
AS  
SELECT user_name(); -- Shows execution context is set to SqlUser1.  
EXECUTE AS CALLER;  
SELECT user_name(); -- Shows execution context is set to SqlUser2, the caller of the module.  
REVERT;  
SELECT user_name(); -- Shows execution context is set to SqlUser1.  
GO  

EXECUTE AS를 사용하여 사용자 지정 권한 집합 정의Using EXECUTE AS to Define Custom Permission Sets

사용자 지정 권한 집합을 정의할 때는 모듈의 실행 컨텍스트를 지정하면 편리합니다.Specifying an execution context for a module can be very useful when you want to define custom permission sets. 예를 들어 TRUNCATE TABLE과 같은 일부 동작에는 부여할 수 있는 사용 권한이 없습니다.For example, some actions, such as TRUNCATE TABLE, do not have grantable permissions. 모듈 내에 TRUNCATE TABLE 문을 삽입하고 해당 모듈이 테이블을 변경할 수 있는 사용 권한이 부여된 사용자로 실행되도록 지정하면 모듈에 대한 EXECUTE 권한을 부여한 사용자에게 테이블을 자를 수 있는 사용 권한도 부여할 수 있습니다.By incorporating the TRUNCATE TABLE statement within a module and specifying that module execute as a user who has permissions to alter the table, you can extend the permissions to truncate the table to the user to whom you grant EXECUTE permissions on the module.

지정된 된 실행 컨텍스트를 사용 하 여 모듈의 정의 보려면 사용 하 여는 sys.sql_modules( Transact SQL ) 카탈로그 뷰에 있습니다.To view the definition of the module with the specified execution context, use the sys.sql_modules (Transact-SQL) catalog view.

최선의 구현 방법Best Practice

모듈에 정의된 작업을 수행하는 데 필요한 최소한의 권한이 있는 로그인이나 사용자를 지정합니다.Specify a login or user that has the least privileges required to perform the operations defined in the module. 예를 들어 데이터베이스 소유자 계정은 해당 권한이 필요한 경우에만 지정하세요.For example, do not specify a database owner account unless those permissions are required.

PermissionsPermissions

EXECUTE AS로 지정된 모듈을 실행하려면 호출자에게 해당 모듈에 대한 EXECUTE 권한이 있어야 합니다.To execute a module specified with EXECUTE AS, the caller must have EXECUTE permissions on the module.

다른 데이터베이스 또는 서버의 리소스에 액세스하는 EXECUTE AS로 지정된 CLR 모듈을 실행하려면 대상 데이터베이스나 서버가 모듈이 원래 속한 원본 데이터베이스의 인증자를 트러스트해야 합니다.To execute a CLR module specified with EXECUTE AS that accesses resources in another database or server, the target database or server must trust the authenticator of the database from which the module originates (the source database).

모듈을 만들거나 수정할 때 EXECUTE AS 절을 지정하려면 지정된 보안 주체에 대한 IMPERSONATE 권한과 모듈을 만들 수 있는 권한이 있어야 합니다.To specify the EXECUTE AS clause when you create or modify a module, you must have IMPERSONATE permissions on the specified principal and also permissions to create the module. 사용자는 항상 자신을 가장할 수 있습니다.You can always impersonate yourself. 실행 컨텍스트를 지정하지 않거나 EXECUTE AS CALLER를 지정한 경우에는 IMPERSONATE 권한이 필요하지 않습니다.When no execution context is specified or EXECUTE AS CALLER is specified, IMPERSONATE permissions are not required.

지정 하는 login_name 또는 user_name Windows 그룹 멤버 자격을 통해 데이터베이스에 대 한 암시적 액세스를 데이터베이스에서 제어 권한이 있어야 합니다.To specify a login_name or user_name that has implicit access to the database through a Windows group membership, you must have CONTROL permissions on the database.

Examples

다음 예에서는 AdventureWorks2012AdventureWorks2012 데이터베이스에 저장 프로시저를 만들고 실행 컨텍스트를 OWNER로 할당합니다.The following example creates a stored procedure in the AdventureWorks2012AdventureWorks2012 database and assigns the execution context to OWNER.

CREATE PROCEDURE HumanResources.uspEmployeesInDepartment   
@DeptValue int  
WITH EXECUTE AS OWNER  
AS  
    SET NOCOUNT ON;  
    SELECT e.BusinessEntityID, c.LastName, c.FirstName, e.JobTitle  
    FROM Person.Person AS c   
    INNER JOIN HumanResources.Employee AS e  
        ON c.BusinessEntityID = e.BusinessEntityID  
    INNER JOIN HumanResources.EmployeeDepartmentHistory AS edh  
        ON e.BusinessEntityID = edh.BusinessEntityID  
    WHERE edh.DepartmentID = @DeptValue  
    ORDER BY c.LastName, c.FirstName;  
GO  

-- Execute the stored procedure by specifying department 5.  
EXECUTE HumanResources.uspEmployeesInDepartment 5;  
GO  

관련 항목:See Also

sys.assembly_modules(Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.sql_modules(Transact-SQL) sys.sql_modules (Transact-SQL)
sys.service_queues ( Transact SQL ) sys.service_queues (Transact-SQL)
되돌리기 ( Transact SQL ) REVERT (Transact-SQL)
실행 AS ( Transact SQL )EXECUTE AS (Transact-SQL)