ALTER AUTHORIZATION (Transact-SQL)

適用対象: はいSQL Server (サポートされているすべてのバージョン) はいAzure SQL データベース はいAzure SQL Managed Instance はいAzure Synapse Analytics はいParallel Data Warehouse

セキュリティ保護可能なエンティティの所有権を変更します。

トピック リンク アイコン Transact-SQL 構文表記規則

構文

-- Syntax for SQL Server
ALTER AUTHORIZATION
    ON [ <class_type>:: ] entity_name
    TO { principal_name | SCHEMA OWNER }
    [;]

<class_type> ::=
     {
      OBJECT | ASSEMBLY | ASYMMETRIC KEY | AVAILABILITY GROUP | CERTIFICATE
    | CONTRACT | TYPE | DATABASE | ENDPOINT | FULLTEXT CATALOG
    | FULLTEXT STOPLIST | MESSAGE TYPE | REMOTE SERVICE BINDING
    | ROLE | ROUTE | SCHEMA | SEARCH PROPERTY LIST | SERVER ROLE
    | SERVICE | SYMMETRIC KEY | XML SCHEMA COLLECTION
     }
-- Syntax for SQL Database

ALTER AUTHORIZATION
    ON [ <class_type>:: ] entity_name
    TO { principal_name | SCHEMA OWNER }
    [;]

<class_type> ::=
     {
    OBJECT | ASSEMBLY | ASYMMETRIC KEY | CERTIFICATE
     | TYPE | DATABASE | FULLTEXT CATALOG
     | FULLTEXT STOPLIST
     | ROLE | SCHEMA | SEARCH PROPERTY LIST
     | SYMMETRIC KEY | XML SCHEMA COLLECTION
     }
-- Syntax for Azure Synapse Analytics

ALTER AUTHORIZATION ON
     [ <class_type> :: ] <entity_name>
     TO { principal_name | SCHEMA OWNER }
    [;]

    <class_type> ::= {
    SCHEMA
     | OBJECT
    }

    <entity_name> ::=
    {
    schema_name
     | [ schema_name. ] object_name
    }
-- Syntax for Parallel Data Warehouse

ALTER AUTHORIZATION ON
     [ <class_type> :: ] <entity_name>
     TO { principal_name | SCHEMA OWNER }
    [;]

<class_type> ::= {
    DATABASE
     | SCHEMA
     | OBJECT
    }

<entity_name> ::=
    {
    database_name
     | schema_name
     | [ schema_name. ] object_name
    }

注意

この構文は、Azure Synapse Analytics のサーバーレス SQL プールでサポートされていません。

注意

SQL Server 2014 以前の Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。

引数

<class_type> 所有者を変更するエンティティのセキュリティ保護可能なクラスを指定します。 既定値は OBJECT です。

クラス Product
OBJECT 適用対象: SQL Server 2008 以降、Azure SQL データベース、Azure Synapse Analytics、Analytics Platform System (PDW)。
ASSEMBLY 適用対象: SQL Server 2008 以降、Azure SQL データベース。
ASYMMETRIC KEY 適用対象: SQL Server 2008 以降、Azure SQL データベース。
AVAILABILITY GROUP 適用対象:SQL Server 2012 以降。
CERTIFICATE 適用対象: SQL Server 2008 以降、Azure SQL データベース。
CONTRACT 適用対象: SQL Server 2008 以降。
DATABASE 適用対象: SQL Server 2008 以降、Azure SQL データベース。 詳細については、「データベースに対する ALTER AUTHORIZATION」を参照してください。
ENDPOINT 適用対象: SQL Server 2008 以降。
FULLTEXT CATALOG 適用対象: SQL Server 2008 以降、Azure SQL データベース。
FULLTEXT STOPLIST 適用対象: SQL Server 2008 以降、Azure SQL データベース。
MESSAGE TYPE 適用対象: SQL Server 2008 以降。
REMOTE SERVICE BINDING 適用対象: SQL Server 2008 以降。
ROLE 適用対象: SQL Server 2008 以降、Azure SQL データベース。
ROUTE 適用対象: SQL Server 2008 以降。
SCHEMA 適用対象: SQL Server 2008 以降、Azure SQL データベース、Azure Synapse Analytics、Analytics Platform System (PDW)。
SEARCH PROPERTY LIST 適用対象: SQL Server 2012 (11.x) 以降、Azure SQL データベース。
SERVER ROLE 適用対象: SQL Server 2008 以降。
SERVICE 適用対象: SQL Server 2008 以降。
SYMMETRIC KEY 適用対象: SQL Server 2008 以降、Azure SQL データベース。
TYPE 適用対象: SQL Server 2008 以降、Azure SQL データベース。
XML SCHEMA COLLECTION 適用対象: SQL Server 2008 以降、Azure SQL データベース。

entity_name はエンティティの名前です。

principal_name | SCHEMA OWNER エンティティの所有者となるセキュリティ プリンシパルの名前。 データベース オブジェクトはデータベース プリンシパル (データベース ユーザーまたはデータベース ロール) が所有する必要があります。 サーバー オブジェクト (データベースなど) はサーバー プリンシパル (ログイン) が所有する必要があります。 SCHEMA OWNER を *principal_name- として指定して、オブジェクトのスキーマを所有するプリンシパルがオブジェクトを所有する必要があることを示します。

解説

ALTER AUTHORIZATION は、所有者が存在するエンティティの所有権を変更するときに使用できます。 データベースに含まれるエンティティの所有権は、任意のデータベース レベルのプリンシパルに譲渡できます。 サーバー レベルのエンティティの所有権は、サーバー レベルのプリンシパルのみに譲渡できます。

重要

SQL Server 2005 (9.x) 以降では、ユーザーは他のデータベース ユーザーが所有するスキーマに含まれる OBJECT または TYPE を所有できます。 これは、以前のバージョンの SQL Serverの動作から変更されています。 詳しくは、「OBJECTPROPERTY (Transact-SQL)」および「TYPEPROPERTY (Transact-SQL)」をご覧ください。

スキーマに含まれるエンティティのうち、種類が "オブジェクト" のエンティティ (テーブル、ビュー、関数、プロシージャ、キュー、およびシノニム) の所有権は譲渡できます。

リンク サーバー、統計、制約、ルール、デフォルト、トリガー、Service Broker キュー、資格情報、パーティション関数、パーティション構成、データベース マスター キー、サービス マスター キー、およびイベント通知の各エンティティの所有権は譲渡できません。

セキュリティ保護可能なリソース クラス (サーバー、ログイン、ユーザー、アプリケーション ロール、および列) のメンバーの所有権は譲渡できません。

SCHEMA OWNER オプションは、スキーマに含まれるエンティティの所有権を譲渡する場合にのみ有効です。 SCHEMA OWNER を使用すると、エンティティの所有権は、所属するスキーマの所有者に譲渡されます。 スキーマに含まれるのは、OBJECT、TYPE、または XML SCHEMA COLLECTION クラスのエンティティのみです。

対象のエンティティがデータベース以外であり、エンティティを新しい所有者に譲渡する場合は、すべての権限が削除されます。

注意事項

SQL Server 2005 (9.x) でのスキーマの動作は、以前のバージョンの SQL Server から変更されました。 コードで、スキーマがデータベース ユーザーと同じであることが前提となっている場合、正しい結果が返されない場合があります。 以下の DDL ステートメントが使用されているデータベースでは、sysobjects などの古いカタログ ビューを使用してはいけません:CREATE SCHEMA、ALTER SCHEMA、DROP SCHEMA、CREATE USER、ALTER USER、DROP USER、CREATE ROLE、ALTER ROLE、DROP ROLE、CREATE APPROLE、ALTER APPROLE、DROP APPROLE、ALTER AUTHORIZATION。 これらのいずれかのステートメントが使用されたデータベースでは、新しいカタログ ビューを使用する必要があります。 新しいカタログ ビューでは、SQL Server 2005 (9.x) で導入されたプリンシパルとスキーマの分離が考慮されます。 カタログ ビューの詳細については、「カタログ ビュー (Transact-SQL)」を参照してください。

また、次の点も注意してください。

重要

オブジェクトの所有者を調べる唯一の信頼性のある方法は、sys.objects カタログ ビューに対するクエリを実行する方法です。 型の所有者を調べる唯一の信頼性のある方法は、TYPEPROPERTY 関数を使用する方法です。

特殊ケースと条件

次の表は、権限を変更する場合の特殊ケースと例外、および条件の一覧です。

クラス 条件
OBJECT トリガー、制約、ルール、デフォルト、統計、システム オブジェクト、キュー、インデックス付きビュー、またはインデックス付きビューのあるテーブルの所有権は変更できません。
SCHEMA 所有権を譲渡すると、スキーマに含まれるオブジェクトの所有者が明示的に指定されていない場合は、そのオブジェクトに対する権限が削除されます。 sys、dbo、または information_schema の所有者は変更できません。
TYPE sys または information_schema に属する TYPE の所有権は変更できません。
CONTRACT、MESSAGE TYPE、SERVICE システム エンティティの所有権は変更できません。
SYMMETRIC KEY グローバル一時キーの所有権は変更できません。
CERTIFICATE または ASYMMETRIC KEY これらのエンティティの所有権をロールまたはグループに譲渡することはできません。
ENDPOINT プリンシパルは、ログインであることが必要です。

データベースに対する ALTER AUTHORIZATION

SQL Server の場合

新しい所有者の要件: 新しい所有者プリンシパルは、次のいずれかである必要があります。

  • SQL サーバー認証ログイン。
  • Windows ユーザー (グループではなく) を表す Windows 認証ログイン。
  • Windows グループを表す Windows 認証ログインを使って認証を行う Windows ユーザー。

ALTER AUTHORIZATION ステートメントを実行するユーザーの要件: sysadmin 固定サーバー ロールのメンバーではないユーザーの場合は、データベースに対する TAKE OWNERSHIP アクセス許可以上と、新しい所有者ログインに対する IMPERSONATE アクセス許可が必要です。

Azure SQL Database の場合

新しい所有者の要件: 新しい所有者プリンシパルは、次のいずれかである必要があります。

  • SQL サーバー認証ログイン。
  • Azure AD 内に存在するフェデレーション ユーザー (グループではなく)。
  • Azure AD 内に存在するマネージド ユーザー (グループではなく) またはアプリケーション。

新しい所有者が Azure Active Directory ユーザーの場合は、新しい所有者が新しい DBO になるデータベース内にユーザーとして存在することはできません。 このような Azure AD ユーザーは、ALTER AUTHORIZATION ステートメントを実行して新しいユーザーにデータベース所有権を変更する前にまず、データベースから削除する必要があります。 SQL Database での Azure Active Directory ユーザーの構成について詳しくは、Azure Active Directory 認証を使用して SQL Database または Azure Synapse Analytics に接続する方法に関するページをご覧ください。

ALTER AUTHORIZATION ステートメントを実行するユーザーの要件: データベースの所有者を変更するには、そのデータベースに接続する必要があります。

次の種類のアカウントは、データベースの所有者を変更できます。

  • サーバー レベルのプリンシパル ログイン (SQL Database サーバー作成時にプロビジョニングされた SQL Azure 管理者)。
  • Azure SQL Server の Azure Active Directory 管理者。
  • データベースの現在の所有者。

次の表は要件をまとめたものです。

実行者 移行先 結果
SQL サーバー認証ログイン SQL サーバー認証ログイン Success
SQL サーバー認証ログイン Azure AD ユーザー 失敗
Azure AD ユーザー SQL サーバー認証ログイン Success
Azure AD ユーザー Azure AD ユーザー Success

データベースの Azure AD 所有者を確認するには、ユーザー データベース (この例では testdb) で次の Transact-SQL コマンドを実行します。

SELECT CAST(owner_sid as uniqueidentifier) AS Owner_SID
FROM sys.databases
WHERE name = 'testdb';

出力は識別子 (6D8B81F6-7C79-444C-8858-4AF896C03C67 など) になります。これは、richel@cqclinic.onmicrosoft.com に割り当てられた Azure AD ObjectID に対応します。SQL Server 認証ログイン ユーザーがデータベース所有者である場合、データベースの所有者を確認するには、master データベースで次のステートメントを実行します。

SELECT d.name, d.owner_sid, sl.name
FROM sys.databases AS d
JOIN sys.sql_logins AS sl
ON d.owner_sid = sl.sid;

ベスト プラクティス

Azure AD ユーザーをデータベースの個人所有者として使う代わりに、Azure AD グループを db_owner 固定データベース ロールのメンバーとして使います。 次の手順では、データベース所有者として無効なログインを構成し、Azure Active Directory グループ (mydbogroup) を db_owner ロールのメンバーにする方法を示します。

  1. Azure AD 管理者として SQL Server にログインし、データベースの所有者を無効化された SQL Server 認証ログインに変更ます。 たとえば、ユーザー データベースから次のコマンドを実行します。

    ALTER AUTHORIZATION ON database::testdb TO DisabledLogin;
    
  2. データベースを所有する Azure AD グループを作成し、そのグループをユーザー データベースにユーザーとして追加します。 次に例を示します。

    CREATE USER [mydbogroup] FROM EXTERNAL PROVIDER;
    
  3. ユーザー データベースで、Azure AD グループを表すユーザーを、db_owner 固定データベース ロールに追加します。 次に例を示します。

    ALTER ROLE db_owner ADD MEMBER mydbogroup;
    

これで、mydbogroup のメンバーは、db_owner ロールのメンバーとしてデータベースを集中管理できます。

  • このグループのメンバーが Azure AD グループから削除されると、このデータベースの dbo アクセス許可を自動的に失います。
  • 同様に、新しいメンバーが mydbogroup Azure AD グループに追加された場合ば、このデータベースの dbo アクセス許可を自動的に取得します。

特定のユーザーが有効な dbo アクセス許可を持つかどうかを確認するには、ユーザーに次のステートメントを実行させます。

SELECT IS_MEMBER ('db_owner');

戻り値 1 は、ユーザーがロールのメンバーであることを示します。

アクセス許可

エンティティに対する TAKE OWNERSHIP 権限が必要です。 新しい所有者がステートメントを実行するユーザーではない場合は、次の条件に応じた権限が必要になります。1) 新しい所有者がユーザーまたはログインの場合は、新しい所有者に対する IMPERSONATE 権限。2) 新しい所有者がロールまたはロールのメンバーシップの場合は、ロールに対する ALTER 権限。3) 新しい所有者がアプリケーション ロールの場合は、アプリケーション ロールに対する ALTER 権限。

A. テーブルの所有権を譲渡する

次の例では、テーブル Sprockets の所有権をユーザー MichikoOsada に譲渡します。 このテーブルは、スキーマ Parts 内にあります。

ALTER AUTHORIZATION ON OBJECT::Parts.Sprockets TO MichikoOsada;
GO

クエリは次のようにもできます。

ALTER AUTHORIZATION ON Parts.Sprockets TO MichikoOsada;
GO

オブジェクトのスキーマがステートメントの一部として含まれない場合、データベース エンジン はユーザーの既定のスキーマでオブジェクトを検索します。 次に例を示します。

ALTER AUTHORIZATION ON Sprockets TO MichikoOsada;
ALTER AUTHORIZATION ON OBJECT::Sprockets TO MichikoOsada;

B. ビューの所有権をスキーマの所有者に譲渡する

次の例では、ビュー ProductionView06 の所有権を、所属するスキーマの所有者に譲渡します。 このビューは、スキーマ Production 内にあります。

ALTER AUTHORIZATION ON OBJECT::Production.ProductionView06 TO SCHEMA OWNER;
GO

C. スキーマの所有権をユーザーに譲渡する

次の例では、スキーマ SeattleProduction11 の所有権をユーザー SandraAlayo に譲渡します。

ALTER AUTHORIZATION ON SCHEMA::SeattleProduction11 TO SandraAlayo;
GO

D. エンドポイントの所有権を SQL Server ログインに譲渡する

次の例では、エンドポイント CantabSalesServer1 の所有権を JaePak に譲渡します。 エンドポイントはサーバー レベルでセキュリティ保護可能なリソースであるため、エンドポイントを譲渡できるのはサーバー レベルのプリンシパルのみです。

適用対象: SQL Server 2008 以降。

ALTER AUTHORIZATION ON ENDPOINT::CantabSalesServer1 TO JaePak;
GO

E. テーブルの所有者を変更する

以下の各例では、Parts データベースの Sprockets テーブルの所有者を、データベース ユーザー MichikoOsada に変更します。

ALTER AUTHORIZATION ON Sprockets TO MichikoOsada;
ALTER AUTHORIZATION ON dbo.Sprockets TO MichikoOsada;
ALTER AUTHORIZATION ON OBJECT::Sprockets TO MichikoOsada;
ALTER AUTHORIZATION ON OBJECT::dbo.Sprockets TO MichikoOsada;

F. データベースの所有者を変更する

適用対象: SQL Server 2008 以降、Analytics Platform System (PDW)、SQL Database。

次の例では、Parts データベースの所有者をログイン MichikoOsada に変更します。

ALTER AUTHORIZATION ON DATABASE::Parts TO MichikoOsada;

G. SQL Database の所有者を Azure AD ユーザーに変更する

次の例では、cqclinic.onmicrosoft.com という名前の Active Directory を使用する組織内の SQL Server の Azure Active Directory 管理者は、次のコマンドを使用して、データベース targetDB の現在の所有権を変更し、AAD ユーザー richel@cqclinic.onmicorsoft.com を新しいデータベース所有者にすることができます。

ALTER AUTHORIZATION ON database::targetDB TO [rachel@cqclinic.onmicrosoft.com];

Azure AD では、ユーザー名を囲む角かっこ [] 必要です。

参照

OBJECTPROPERTY (Transact-SQL)」「TYPEPROPERTY (Transact-SQL)」「EVENTDATA (Transact-SQL)