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

適用対象: ○SQL Server (2008 以降) ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database noAzure 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

CALLERCALLER
モジュール内のステートメントを、モジュールの呼び出し元のコンテキストで実行します。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 2005 (9.x)SQL Server 2005 (9.x) の場合と同じです。CALLER is the default for all modules except queues, and is the same as SQL Server 2005 (9.x)SQL Server 2005 (9.x) behavior.

CALLER は、CREATE QUEUE または ALTER QUEUE ステートメントでは指定できません。CALLER cannot be specified in a CREATE QUEUE or ALTER QUEUE statement.

SELFSELF
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 は、sys.sql_modules または sys.service_queues カタログ ビューの execute_as_principal_id 列に格納されます。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.

注意

sys.service_queues カタログ ビューの execute_as_principal_id 列のユーザー ID を変更するには、ALTER QUEUE ステートメントで EXECUTE AS 設定を明示的に指定する必要があります。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. OWNER は、DDL トリガーまたはログオン トリガーに対しては指定できません。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 はメタデータ内に格納され、sys.sql_modules または sys.assembly_modules カタログ ビューの execute_as_principal_id 列で参照できます。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 '
モジュール内部のステートメントを、login_name で指定された SQL ServerSQL Server ログインのコンテキストで実行します。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.

RemarksRemarks

データベース エンジン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 ステートメントにのみ適用されます:SELECT、INSERT、UPDATE、DELETE。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\SqlUser1SQLUsers のメンバーであり、したがって 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.

アクセス許可Permissions

EXECUTE AS で指定されたモジュールを実行するには、呼び出し元に、そのモジュールに対する EXECUTE 権限が必要です。To execute a module specified with EXECUTE AS, the caller must have EXECUTE permissions on the module.

別のデータベースまたはサーバー内のリソースにアクセスする CLR モジュールを、EXECUTE AS で指定して実行する場合、対象のデータベースまたはサーバーは、モジュールが生成されたデータベース (基になるデータベース) の認証情報を信頼する必要があります。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.

Windows グループのメンバーシップを使ってデータベースに暗黙的にアクセスできる login_name または user_name を指定するには、そのデータベースに対する CONTROL 権限が必要です。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)
REVERT (Transact-SQL) REVERT (Transact-SQL)
EXECUTE AS (Transact-SQL)EXECUTE AS (Transact-SQL)