CREATE SCHEMA (Transact-SQL)

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

現在のデータベースにスキーマを作成します。 CREATE SCHEMA トランザクションでは、新しいスキーマにテーブルとビューを作成し、それらのオブジェクトに GRANT、DENY、または REVOKE 権限を設定することもできます。

Transact-SQL 構文表記規則

構文

-- Syntax for SQL Server and Azure SQL Database  
  
CREATE SCHEMA schema_name_clause [ <schema_element> [ ...n ] ]  
  
<schema_name_clause> ::=  
    {  
    schema_name  
    | AUTHORIZATION owner_name  
    | schema_name AUTHORIZATION owner_name  
    }  
  
<schema_element> ::=   
    {   
        table_definition | view_definition | grant_statement |   
        revoke_statement | deny_statement   
    }  
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse  
  
CREATE SCHEMA schema_name [ AUTHORIZATION owner_name ] [;]  

Note

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

引数

schema_name
データベース内でスキーマを識別する名前を指定します。

AUTHORIZATION owner_name
スキーマを所有するデータベース レベルのプリンシパルの名前を指定します。 このプリンシパルは他のスキーマを所有できますが、現在のスキーマを既定のスキーマとして使用することはできません。

table_definition
スキーマ内のテーブルを作成する CREATE TABLE ステートメントを指定します。 このステートメントを実行するプリンシパルには、現在のデータベースに対する CREATE TABLE 権限が必要です。

view_definition
スキーマ内でビューを作成する CREATE VIEW ステートメントを指定します。 このステートメントを実行するプリンシパルには、現在のデータベースに対する CREATE VIEW 権限が必要です。

grant_statement
セキュリティ保護可能なリソース (ただし新しいスキーマを除く) に対する権限を与える GRANT ステートメントを指定します。

revoke_statement
セキュリティ保護可能なリソース (ただし新しいスキーマを除く) に対する権限を取り消す REVOKE ステートメントを指定します。

deny_statement
セキュリティ保護可能なリソース (ただし新しいスキーマを除く) に対する権限を拒否する DENY ステートメントを指定します。

解説

Note

ステートメントに CREATE SCHEMA AUTHORIZATION を使用し、スキーマ名を指定しなくても、このステートメントは許可されます。ただしこれは、旧バージョンとの互換性の維持を目的としたものです。 ステートメントでエラーは発生しませんが、スキーマは作成されません。

CREATE SCHEMA を使用すると、スキーマとそれに含まれるテーブルおよびビューを作成できます。また、単一のステートメントで、セキュリティ保護可能なリソースに対する権限を許可 (GRANT)、取り消し (REVOKE)、または拒否 (DENY) することもできます。 このステートメントは個別のバッチとして実行する必要があります。 CREATE SCHEMA ステートメントでは、作成するスキーマ内にオブジェクトが作成されます。

CREATE SCHEMA トランザクションはアトミックです。 CREATE SCHEMA ステートメントの実行中にエラーが発生した場合、指定したセキュリティ保護可能なリソースは作成されず、権限は与えられません。

CREATE SCHEMA により作成されるセキュリティ保護可能なリソースは、他のビューを参照するビューを除き、任意の順序で一覧表示できます。 この場合、参照先のビューは参照元のビューより前に作成しておく必要があります。

したがって、オブジェクト自体の作成前に GRANT ステートメントでそのオブジェクトに対する権限を許可したり、CREATE TABLE ステートメントでビューの参照先テーブルを作成する前に CREATE VIEW ステートメントを記述することができます。 また、CREATE TABLE ステートメントでは、CREATE SCHEMA ステートメントで後から定義するテーブルに対して外部キーを宣言できます。

Note

CREATE SCHEMA ステートメント内で DENY および REVOKE を使用できます。 DENY および REVOKE 句は、CREATE SCHEMA ステートメントで指定した順序に従って実行されます。

CREATE SCHEMA を実行するプリンシパルは、作成するスキーマの所有者として別のデータベース プリンシパルを指定できます。 これには、後の「権限」で示す追加の権限が必要になります。

新しいスキーマは、データベース ユーザー、データベース ロール、またはアプリケーション ロールのいずれかのデータベース レベルのプリンシパルが所有します。 スキーマ内に作成されるオブジェクトはスキーマの所有者が所有し、 sys.objects 内の principal_idは NULL になります。 スキーマが含まれるオブジェクトの所有権は、データベース レベルのプリンシパルに譲渡できますが、スキーマ内のオブジェクトに対する CONTROL 権限は常にスキーマ所有者が保持します。

注意事項

SQL Server 2005 からスキーマの動作が変更されました。 その結果、スキーマがデータベース ユーザーと同じであると想定しているコードでは、正しい結果が返されない場合があります。 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 のいずれかの DDL ステートメントが使用されたことのあるデータベースでは、sysobjects などの古いカタログ ビューを使用しないでください。 そのようなデータベースでは、代わりに新しいカタログ ビューを使用してください。 新しいカタログ ビューでは、SQL Server 2005 で導入されたプリンシパルとスキーマの分離が考慮されます。 カタログ ビューの詳細については、「カタログ ビュー (Transact-SQL)」を参照してください。

スキーマおよびユーザーの暗黙的な作成

データベース ユーザー アカウント (データベース内のデータベース プリンシパル) がなくても、ユーザーがデータベースを使用できる場合があります。 これは、次の状況で発生します。

  • ログインが CONTROL SERVER 特権を持っている。

  • Windows ユーザーに個別のデータベース ユーザー アカウント (データベース内のデータベース プリンシパル) はないが、データベース ユーザー アカウント (Windows グループのデータベース プリンシパル) を持つ Windows グループのメンバーとしてデータベースにアクセスする。

データベース ユーザー アカウントを持たないユーザーが既存のスキーマを指定せずにオブジェクトを作成すると、そのユーザーに対してデータベース内にデータベース プリンシパルおよび既定のスキーマが自動的に作成されます。 作成されるデータベース プリンシパルおよびスキーマには、ユーザーが SQL Server に接続するときに使用した名前と同じ名前が付いています (SQL Server 認証ログイン名または Windows ユーザー名)。

この動作が必要なのは、ユーザーが Windows グループに基づいてオブジェクトを作成および所有できるようにするためです。 ただし、スキーマおよびユーザーが誤って作成される可能性があります。 ユーザーおよびスキーマが暗黙的に作成されないように、可能な限り、明示的にデータベース プリンシパルを作成して既定のスキーマを割り当てます。 または、データベース内にオブジェクトを作成するときに、2 部または 3 部構成のオブジェクト名を使用して既存のスキーマを明示的に指定します。

Note

SQL Database では、Azure Active Directory ユーザーを暗黙的に作成することはできません。 外部プロバイダーからの Azure AD ユーザーの作成では AAD でユーザーの状態を確認する必要があるので、ユーザーの作成はエラー 2760 "指定されたスキーマ名 "<user_name@domain>" が存在しないか、そのスキーマ名を使用する権限がありません"、およびその後のエラー 2759 "直前のエラーにより CREATE SCHEMA に失敗しました" で失敗します。これらのエラーを回避するには、最初に外部プロバイダーから Azure AD ユーザーを作成し、次にオブジェクト作成ステートメントを再実行します。

今後のバージョンでの使用

スキーマ名を指定しない CREATE SCHEMA ステートメントは、現在では旧バージョンとの互換性のためにのみサポートされています。 このようなステートメントは実際には、データベース内のスキーマを作成できませんが、テーブルやビューを作成し、アクセス許可を付与する操作を行います。 スキーマが作成されないので、以前の形式の CREATE SCHEMA を実行する際、プリンシパルには CREATE SCHEMA 権限は必要ありません。 この機能は SQL Server の今後のリリースでは削除される予定です。

アクセス許可

データベースに対する CREATE SCHEMA 権限が必要です。

CREATE SCHEMA ステートメント内で指定するオブジェクトを作成するには、ユーザーは、オブジェクトに対応する CREATE 権限を持っている必要があります。

別のユーザーを、作成されるスキーマの所有者として指定する場合、呼び出し元は、そのユーザーに対する IMPERSONATE 権限を持っている必要があります。 データベース ロールを所有者として指定する場合、呼び出し元は、データベース ロールのメンバーシップまたはデータベース ロールに対する ALTER 権限のいずれかを持っている必要があります。

Note

旧バージョンとの互換性のための構文では、スキーマが作成されないので、CREATE SCHEMA に対する権限はチェックされません。

A. スキーマを作成して、権限を付与する

次の例では、Annik が所有するスキーマ Sprockets を作成します。このスキーマにはテーブル NineProngs が含まれます。 このステートメントでは、SELECT に対して Mandar を許可し、SELECT に対して Prasanna を拒否します。 SprocketsNineProngs は単一のステートメントで作成されることに注意してください。

USE AdventureWorks2012;  
GO  
CREATE SCHEMA Sprockets AUTHORIZATION Annik  
    CREATE TABLE NineProngs (source int, cost int, partnumber int)  
    GRANT SELECT ON SCHEMA::Sprockets TO Mandar  
    DENY SELECT ON SCHEMA::Sprockets TO Prasanna;  
GO   

例: Azure Synapse Analytics、Analytics Platform System (PDW)

B. スキーマとスキーマ内のテーブルを作成する

次の例では、スキーマ Sales を作成した後、そのスキーマ内にテーブル Sales.Region を作成します。

CREATE SCHEMA Sales;  
GO
  
CREATE TABLE Sales.Region   
(Region_id INT NOT NULL,  
Region_Name CHAR(5) NOT NULL)  
WITH (DISTRIBUTION = REPLICATE);  
GO  

C. スキーマの所有者を設定する

次の例では、Mary が所有するスキーマ Production を作成します。

CREATE SCHEMA Production AUTHORIZATION [Contoso\Mary];  
GO  

参照

ALTER SCHEMA (Transact-SQL)
DROP SCHEMA (Transact-SQL)
GRANT (Transact-SQL)
DENY (Transact-SQL)
REVOKE (Transact-SQL)
CREATE VIEW (Transact-SQL)
EVENTDATA (Transact-SQL)
sys.schemas (Transact-SQL)
データベース スキーマの作成