모듈에서 EXECUTE AS 사용

EXECUTE AS는 함수, 프로시저, 큐 및 트리거와 같은 사용자 정의 모듈의 실행 컨텍스트를 정의하는 데 사용될 수 있습니다. 예를 들어 실행 컨텍스트는 모듈 호출자에서 모듈 소유자로 또는 지정된 사용자로 전환될 수 있습니다. 이전 버전의 SQL Server에서 이러한 모듈은 항상 모듈 호출자의 컨텍스트에서 실행되었습니다.

모듈이 실행되는 컨텍스트를 지정해서 데이터베이스 엔진 사용자 계정을 제어하면 모듈에서 참조하는 개체에 대한 사용 권한을 검사할 수 있습니다. 이렇게 하면 사용자 정의 모듈 및 해당 모듈에서 참조하는 개체 사이에 있는 개체 체인에서 좀 더 유연하게 사용 권한 관리를 제어할 수 있습니다. 모듈 사용자는 해당 모듈의 실행 권한만 필요하며, 참조되는 개체에 대한 명시적 사용 권한은 필요하지 않습니다. 모듈이 실행 중인 사용자만이 모듈에서 액세스한 개체에 대한 사용 권한을 가져야 합니다.

EXECUTE AS CALLER

EXECUTE AS CALLER는 모듈 내의 문이 모듈 호출자의 컨텍스트에서 실행되도록 지정합니다.

다음 시나리오에서 EXECUTE AS CALLER를 사용하십시오.

  • 모듈의 문을 호출 사용자로 실행합니다.

  • 모듈의 문을 호출 사용자에 대해 기준 사용 권한 검사를 수행하고 소유권 체인에만 의존하여 원본 개체에 대한 사용 권한 검사를 수행하지 않습니다. 소유권 체인은 DML 문에만 적용됩니다. 소유권 체인에 대한 자세한 내용은 소유권 체인을 참조하십시오.

  • 응용 프로그램에서는 사용자로부터 원본 참조 개체를 숨길 필요가 없으며 사용자는 동일 소유권의 개체만 참조하고 따라서 소유 체인에 의존하여 스키마 숨김 기능을 제공할 수 있습니다.

  • SQL Server 2000 동작을 보존합니다.

EXECUTE AS CALLER 시나리오

Mary는 자신의 소유는 아니지만 SELECT 권한이 있는 테이블을 참조하는 저장 프로시저를 만들고 이 예에 표시된 것처럼 CREATE PROCEDURE 문에서 EXECUTE AS CALLER를 지정합니다.

CREATE PROCEDURE AccessTable
WITH EXECUTE AS CALLER
AS SELECT * FROM dbo.SomeTable;

Mary는 이 저장 프로시저에 대한 EXECUTE 권한을 Scott에게 부여합니다. Scott이 저장 프로시저를 실행할 때 데이터베이스 엔진은 그(호출자)에게 저장 프로시저 실행 권한이 있는지 확인합니다. Scott에게는 EXECUTE 권한이 있지만 Mary가 참조 테이블의 소유자가 아니기 때문에 데이터베이스 엔진은 Scott에게 테이블에 대한 사용 권한이 있는지 확인합니다. Scott에게 사용 권한이 없으면 저장 프로시저 문이 실패합니다.

EXECUTE AS user_name

EXECUTE AS user_name은 모듈 내의 문이 user_name에 지정된 사용자의 컨텍스트에서 실행되도록 지정합니다.

EXECUTE AS user_name은 다음 시나리오에서 사용하십시오.

  • 모듈에 있는 문이 지정된 사용자의 컨텍스트에서 실행됩니다.

  • 소유권 체인에 의존하여(예: 서로 다른 소유권이 있는 개체에 액세스하는 모듈) 기본 스키마를 숨길 수 없으며, 이러한 참조 개체에 사용 권한을 부여하지 않습니다.

  • 사용자 지정 권한 집합을 만듭니다. 예를 들어 특정 사용 권한을 일반적으로 부여할 수 없는 DDL 작업에 사용 권한을 제공합니다. 자세한 내용은 EXECUTE AS를 사용하여 사용자 지정 권한 집합 만들기를 참조하십시오.

    [!참고]

    모듈의 실행 컨텍스트로 지정된 사용자는 해당 모듈의 실행 컨텍스트가 변경될 때까지 삭제될 수 없습니다.

EXECUTE AS user_name 시나리오

Mary는 자신의 소유는 아니지만 SELECT 권한이 있는 테이블을 참조하는 저장 프로시저를 만들고 이 예에 표시된 것처럼 CREATE PROCEDURE 문에서 EXECUTE AS 'Mary'를 지정합니다.

CREATE PROCEDURE AccessMyTable
WITH EXECUTE AS 'Mary'
AS SELECT * FROM dbo.MyTable;

Mary는 이 저장 프로시저에 대한 EXECUTE 권한을 Scott에게 부여합니다. Scott이 저장 프로시저를 실행할 때 데이터베이스 엔진은 그에게 저장 프로시저 실행 권한이 있는지 확인하지만 참조 테이블에 대한 사용 권한은 Mary에게 있는 것으로 확인되었습니다. 이 시나리오에서 Scott에게는 테이블에 대한 SELECT 권한이 직접적으로 없지만 해당 컨텍스트에서 프로시저를 실행 중인 Mary에게 테이블의 데이터를 액세스할 수 있는 권한이 있기 때문에 Scott은 프로시저를 통해 데이터에 액세스할 수 있습니다.

EXECUTE AS SELF

EXECUTE AS SELF는 지정된 사용자가 모듈을 만들거나 수정하는 사람인 EXECUTE AS user_name과 동일합니다.

EXECUTE AS SELF는 다음 시나리오에서 사용하십시오.

  • 다른 사용자 이름으로 만들거나 수정 중인 모듈의 문을 실행하려는 컨텍스트에 있는 사용자로 자신을 지정하는 바로 가기를 만듭니다.

  • 응용 프로그램에서 사용자가 호출하는 모듈을 만들고 실행 컨텍스트로 이러한 사용자를 사용하여 이 모듈을 만듭니다. 이 시나리오에서는 디자인 타임에 사용자 이름 호출을 알 수 없습니다.

EXECUTE AS OWNER

EXECUTE AS OWNER는 모듈 내의 문이 모듈의 현재 소유자 컨텍스트에서 실행되도록 지정합니다. 모듈에 지정된 소유자가 없으면 해당 모듈의 스키마 소유자를 사용합니다.

EXECUTE AS OWNER는 다음 시나리오에서 사용하십시오.

  • 모듈 자체를 수정하지 않고 모듈 소유자를 변경합니다. 즉, OWNER가 런타임에 모듈의 현재 소유자로 자동 매핑됩니다.

OWNER는 모듈의 명시적 소유자이거나 명시적 소유자가 없는 경우에는 모듈이 실행되는 당시의 모듈의 스키마 소유자입니다. OWNER는 단일 계정이어야 하며 그룹이나 역할이 아니어야 합니다. 모듈의 소유권은 모듈에서 EXECUTE AS OWNER를 지정하고 명시적 소유자가 있는 경우 그룹이나 역할로 변경될 수 있습니다. 스키마의 소유권은 EXECUTE AS OWNER를 지정하는 모듈이 포함되어 있고 모듈에 명시적 소유자가 없는 경우 역할이나 그룹으로 변경될 수 없습니다.

EXECUTE AS OWNER 시나리오

Mary는 그녀가 소유하는 테이블을 참조하는 저장 프로시저를 만듭니다. 이 예에 표시된 것처럼 CREATE PROCEDURE 문에서 EXECUTE AS OWNER를 지정합니다.

CREATE PROCEDURE Mary.AccessMyTable
WITH EXECUTE AS OWNER
AS SELECT * FROM Mary.MyTable;

Mary는 이 저장 프로시저에 대한 EXECUTE 권한을 Scott에게 부여합니다. Scott이 저장 프로시저를 실행할 때 데이터베이스 엔진은 그에게 저장 프로시저 실행 권한이 있는지 확인하지만 Mary가 이 프로시저의 현재 소유자이기 때문에 참조 테이블에 대한 사용 권한은 Mary에게 있는 것으로 확인되었습니다. Mary는 회사를 퇴사하기로 결정하고 프로시저 및 테이블의 소유권을 Tom으로 바꿉니다. 소유권이 변경된 후 Scott이 저장 프로시저를 실행해도 OWNER가 Tom으로 자동 매핑되기 때문에 프로시저를 통해 데이터에 계속 액세스할 수 있습니다.