次の方法で共有


スキーマの作成(Transact-SQL)

Applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric の SQL 分析エンドポイントMicrosoft Fabric のウェアハウス

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

Transact-SQL 構文表記規則

構文

SQL Server および Azure SQL データベース の構文

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
    }

Azure Synapse Analytics と Parallel Data Warehouse の構文。

CREATE SCHEMA schema_name [ AUTHORIZATION owner_name ] [;]

引数

schema_name

データベース内のスキーマの名前を指定します。

オーソリ イowner_name

スキーマを所有するデータベース レベルのプリンシパルの名前を指定します。 このプリンシパルは、他のスキーマを所有している可能性があり、現在のスキーマを既定のスキーマとして使用しない場合があります。

table_definition

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

view_definition

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

grant_statement

新しいスキーマを除くセキュリティ保護可能なリソースに対するアクセス許可を付与する GRANT ステートメントを指定します。

revoke_statement

新しいスキーマを除くセキュリティ保護可能なリソースに対するアクセス許可を取り消す REVOKE ステートメントを指定します。

deny_statement

新しいスキーマを除くセキュリティ保護可能なリソースに対するアクセス許可を拒否する DENY ステートメントを指定します。

解説

CREATE SCHEMA AUTHORIZATIONを含むが、名前を指定しないステートメントは、下位互換性のためにのみ許可されます。 このステートメントではエラーは発生しませんが、スキーマは作成されません。

CREATE SCHEMA では、1 つのステートメントでセキュリティ保護可能な任意のセキュリティ保護可能な権限に対するスキーマ、それに含まれるテーブルとビュー、 GRANTREVOKE、または DENY アクセス許可を作成できます。 このステートメントは、別のバッチとして実行する必要があります。 CREATE SCHEMA ステートメントによって作成されたオブジェクトは、作成するスキーマ内に作成されます。

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

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

そのため、GRANT ステートメントは、オブジェクト自体が作成される前にオブジェクトに対するアクセス許可を付与できます。または、ビューによって参照されるテーブルを作成するCREATE TABLE ステートメントの前にCREATE VIEW ステートメントを指定できます。 また、 CREATE TABLE ステートメントでは、 CREATE SCHEMA ステートメントの後半で定義されたテーブルに対して外部キーを宣言できます。

DENY および REVOKE は、 CREATE SCHEMA ステートメント内でサポートされています。 DENY 句と REVOKE 句は、 CREATE SCHEMA ステートメントに表示される順序で実行されます。

CREATE SCHEMAを実行するプリンシパルは、作成するスキーマの所有者として別のデータベース プリンシパルを指定できます。 この操作には、この記事の後半の「 アクセス許可」 セクションで説明するように、追加のアクセス許可が必要です。

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

スキーマは、データベース ユーザーと同等ではありません。 システム カタログ ビューを使用して、データベース ユーザーとスキーマの違いを特定します。

暗黙的なスキーマとユーザーの作成

Microsoft Entra ID の、旧称は Azure Active Directory(Azure AD)です。

場合によっては、ユーザーはデータベース ユーザー アカウント (データベース内のデータベース プリンシパル) を持たずにデータベースを使用できます。 この状態は、次の状況で発生する可能性があります。

  • ログインには CONTROL SERVER 特権があります。

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

  • Microsoft Entra ユーザーには、個々のデータベース ユーザー アカウント (データベース内のデータベース プリンシパル) はありませんが、データベース ユーザー アカウント (Microsoft Entra グループのデータベース プリンシパル) を持つ Microsoft Entra グループのメンバーとしてデータベースにアクセスします。

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

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

SQL Database では、Microsoft Entra ユーザーを暗黙的に作成することはできません。 外部プロバイダーから Microsoft Entra ユーザーを作成するには、Microsoft Entra ID でユーザーの状態を確認する必要があるため、ユーザーの作成はエラー 2760: The specified schema name "<user@domain>" either does not exist or you do not have permission to use it. And then error 2759 で失敗します。 CREATE SCHEMA failed due to previous errors.

スキーマを作成または変更しようとすると、エラー 15151: Cannot find the user '', because it does not exist or you do not have permission.、エラー 2759 が続きます。 これらのエラーを回避するには、外部プロバイダーから Microsoft Entra ユーザーを作成するか、Microsoft Entra グループを変更して既定のスキーマを割り当てます。 その後、オブジェクトを作成するステートメントを再実行します。

Microsoft Fabric の SQL 分析エンドポイントと Warehouse では、スキーマ名に /\ を含めたり、 .で終わったりすることはできません。

非推奨の通知

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

アクセス許可

データベース CREATE SCHEMA アクセス許可が必要です。

CREATE SCHEMA ステートメント内で指定されたオブジェクトを作成するには、対応するCREATE権限が必要です。

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

下位互換性のある構文では、スキーマが作成されていないため、 CREATE SCHEMA に対するアクセス許可はチェックされません。

A。 スキーマを作成し、アクセス許可を付与する

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

USE AdventureWorks2022;
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. スキーマの所有者を設定する

次の例では、 Production スキーマを作成し、 Mary を所有者として設定します。

CREATE SCHEMA Production AUTHORIZATION [Contoso\Mary];
GO