CREATE SCHEMA (Transact-SQL)
現在のデータベースにスキーマを作成します。CREATE SCHEMA トランザクションでは、新しいスキーマにテーブルとビューを作成し、それらのオブジェクトに GRANT、DENY、または REVOKE 権限を設定することもできます。
構文
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
}
引数
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 ステートメントを指定します。
説明
注意 |
---|
ステートメントに 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 ステートメントで後から定義するテーブルに対して外部キーを宣言できます。
注意 |
---|
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)」を参照してください。 |
今後のバージョンでの使用
スキーマ名を指定しない CREATE SCHEMA ステートメントは、現在では旧バージョンとの互換性のためにのみサポートされています。このようなステートメントでは、データベース内に実際にスキーマは作成されませんが、テーブルとビューが作成され、権限が許可されます。スキーマが作成されないので、以前の形式の CREATE SCHEMA を実行する際、プリンシパルには CREATE SCHEMA 権限は必要ありません。この機能は SQL Server の今後のリリースでは削除される予定です。
権限
データベースに対する CREATE SCHEMA 権限が必要です。
CREATE SCHEMA ステートメント内で指定するオブジェクトを作成するには、ユーザーは、オブジェクトに対応する CREATE 権限を持っている必要があります。
別のユーザーを、作成されるスキーマの所有者として指定する場合、呼び出し元は、そのユーザーに対する IMPERSONATE 権限を持っている必要があります。データベース ロールを所有者として指定する場合、呼び出し元は、データベース ロールのメンバシップまたはデータベース ロールに対する ALTER 権限のいずれかを持っている必要があります。
注意 |
---|
旧バージョンとの互換性のための構文では、スキーマが作成されないので、CREATE SCHEMA に対する権限はチェックされません。 |
例
次の例では、Annik が所有するスキーマ Sprockets を作成します。このスキーマにはテーブル NineProngs が含まれます。このステートメントでは、Mandar に対して SELECT を許可し、Prasanna に対して SELECT を拒否します。Sprockets と NineProngs は単一のステートメントで作成されることに注意してください。
USE AdventureWorks;
GO
CREATE SCHEMA Sprockets AUTHORIZATION Annik
CREATE TABLE NineProngs (source int, cost int, partnumber int)
GRANT SELECT TO Mandar
DENY SELECT TO Prasanna;
GO