この記事では、データベーススキーマとは何か、その利点、およびSQLServerでスキーマを作成して使用する方法について説明します。
SQL Serverなどのリレーショナルデータベース管理システムでは、データベースにさまざまなオブジェクトが含まれています。これらは、テーブル、ストアドプロシージャ、ビュー、および関数です。データベースでは、スキーマはデータベースオブジェクトの論理コレクションを参照します。スキーマを使用して、アプリケーション、アクセス権、およびセキュリティに応じてオブジェクトを分離できます。
SQLServerスキーマ
SQL Serverには、次の組み込み論理スキーマが用意されています。
- dbo
- sys
- ゲスト
- INFORMATION_SCHEMA
すべてのSQLServerスキーマには、スキーマ所有者としてデータベースユーザーが必要です。スキーマの所有者は、スキーマを完全に制御できます。スキーマの所有者を変更したり、オブジェクトをあるスキーマから別のスキーマに移動したりすることもできます。
SQL Serverスキーマには、次の利点があります。
- 論理グループ内のデータベースオブジェクトを管理するための柔軟性と制御を提供します
- 異なるスキーマ間でオブジェクトをすばやく移動できます
- スキーマレベルでオブジェクトのセキュリティを管理できます
- ユーザーがデータベース内のオブジェクトの論理グループを管理できるようにします
- ユーザーがさまざまなスキーマ間で所有権を譲渡できるようにします
組織のデータベースで、部門に基づいてオブジェクトをグループ化するとします。たとえば、HR部門のテーブルとストアドプロシージャは、[HR]スキーマで論理的にグループ化する必要があります。同様に、財務部門のテーブルは[Fin]スキーマに含まれている必要があります。各スキーマ(論理グループ)には、テーブル、ストアドプロシージャ、ビュー、関数、インデックス、タイプ、シノニムなどのSQLServerオブジェクトが含まれています。
注:スキーマはデータベーススコープのエンティティです。 SQLServerインスタンスの異なるデータベースに同じスキーマを含めることができます。
デフォルトでは、SQLServerはデータベース内のすべてのオブジェクトに[dbo]スキーマを使用します。 SCHEMA_NAME()を照会して、接続されているユーザーのデフォルトのスキーマを取得できます。
SELECT SCHEMA_NAME() AS defaultschema;
現在のデータベース内のすべてのデータベーススキーマを一覧表示する
SSMSまたはT-SQLクエリを使用してスキーマのリストを取得できます。 SSMSでこれを行うには、SQLインスタンスに接続し、SQLデータベースを展開して、セキュリティフォルダーの下のスキーマを表示します。
または、sys.schemasを使用して、データベーススキーマとそれぞれの所有者のリストを取得することもできます。
SELECT s.name AS schema_name, u.name AS schema_owner FROM sys.schemas s INNER JOIN sys.sysusers u ON u.uid = s.principal_id ORDER BY s.name;
CREATESCHEMAを使用したSQLServerスキーマの作成
新しいSQLServerスキーマを作成するには、CREATESCHEMAt-SQLステートメントを使用します。その構文を以下に示します。
CREATE SCHEMA <schema_name> AUTHORIZATION <owner_name>
- Schema_name:これは私たちが作成したいスキーマです
- 承認:これはスキーマ所有者名です
[dbo]スキーマ所有者を使用してスキーマ[HR]、[Admin]、および[Fin]を作成するためのスクリプトを以下に示します。
CREATE SCHEMA HR AUTHORIZATION dbo; GO CREATE SCHEMA Admin AUTHORIZATION dbo; Go CREATE SCHEMA Fin AUTHORIZATION dbo; GO
以下に示すように、データベースを更新して、新しく作成されたスキーマを表示できます。
スキーマ内に新しいテーブルを作成する
テーブルなどのオブジェクトを作成するには、オブジェクトを作成するスキーマ名を指定する必要があります。たとえば、次のスクリプトは、異なるスキーマ[HR]、[Admin]、および[Fin]で[TableA]を作成します。
CREATE TABLE HR.TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) ) CREATE TABLE [Admin].TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) ) CREATE TABLE [Fin].TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) )
sys.tablesシステムテーブルとsys.schemaシステムテーブルを結合して、テーブル名とそれらのスキーマを一覧表示できます。たとえば、次のクエリは[TableA]とそのスキーマを返します。
SELECT s.name AS SchemaName, t.name AS TableName FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id WHERE t.name ='TableA'
オブジェクトの作成時にスキーマを指定しない場合、SQLServerはデフォルトのスキーマを使用します。たとえば、次のスクリプトはdboスキーマにTableAを作成します。
CREATE TABLE TableA ( ID int identity(1,1) PRIMARY KEY, [Name] varchar(100) )
注:データベースの別のスキーマに同じ名前のテーブルを作成できます。
正しいスキーマからデータをフェッチするには、テーブルスキーマを指定する必要があります。たとえば、上記のように、すべてのスキーマに[TableA]があります。したがって、スキーマを指定せずにレコードを直接選択すると、デフォルトのDBOスキーマでオブジェクトが検索されます。したがって、データの取得や操作の実行には、必ずSELECT *FROMHR.TableAなどのスキーマ名を指定してください。
スキーマ内でのストアドプロシージャの作成
同様に、指定したスキーマにストアドプロシージャなどのオブジェクトを作成できます。たとえば、次のスクリプトはHRスキーマにSPを作成します。
CREATE PROCEDURE HR.GetEmpData AS BEGIN SELECT * FROM [HR].[TableA] END
オブジェクトを別のスキーマに転送する
ある時点で、オブジェクトを特定のスキーマに移動する必要がある場合があります。たとえば、新しいスキーマ[Org]を作成し、[HR]。[TableA]を[HR]スキーマから[Org]スキーマに移動するとします。
この場合、次の構文でAlterSCHEMAコマンドを使用できます。
ALTER SCHEMA target_schema_name TRANSFER [ entity_type :: ] securable_name;
次のスクリプトは、オブジェクト[HR]。[TableA]を[Org]スキーマに転送します。
CREATE SCHEMA [ORG] GO ALTER SCHEMA ORG TRANSFER HR.TableA
それでは、ストアドプロシージャ[HR]。[GetEmpData]を[Org]スキーマに転送しましょう。
ALTER SCHEMA ORG TRANSFER HR.GetEmpData
スクリプトを実行すると、[Org]スキーマにストアドプロシージャが表示されます。
ただし、ストアドプロシージャ内では、コードは引き続き[HR]。[TableA]スキーマを参照します。
したがって、ALTER SCHEMA関数を使用してストアドプロシージャ、関数、またはビューを移動しないでください。定義内のオブジェクトへの参照が含まれている可能性があります。代わりに、以下に示すように、プロシージャを削除、作成、または変更できます。
スキーマの削除
SQL Serverデータベースにスキーマをドロップできますが、スキーマはオブジェクトを保持してはなりません。たとえば、[Org]スキーマを削除しようとすると、オブジェクトGetEmpDataがスキーマを参照しているため、スキーマを削除できないというエラーが表示されます。
したがって、オブジェクトを別のスキーマに転送するか、最初にオブジェクトをドロップすることができます。たとえば、GetEmpDataストアドプロシージャを削除してから、スキーマを削除してみましょう。 [Org]スキーマに[TableA]があるため、再びエラーが発生しました。
データベーススキーマ内のすべてのオブジェクトを削除または移動したら、スキーマを削除できます。
注:dbo、information_schema、sysなどのシステムスキーマを削除することはできません。
データベーススキーマを使用する利点
- データベーススキーマは、データベースに論理オブジェクトグループを作成する柔軟性を提供します。複数のチームが同じデータベースで作業している場合、オブジェクトを分離するためにさまざまなスキーマを設計できます。
- データベーススキーマは、データベース全体へのアクセスを提供する代わりに、それぞれのスキーマのユーザーへのアクセスを制御できるため、データベースの専門家がアクセスを管理するのに役立ちます。
- 複数のスキーマ内の同じオブジェクトを異なる論理グループとして表示できるため、データベースをより効率的に管理できます。
- 異なるスキーマ内でオブジェクトをすばやく移動できます。
- スキーマの所有権は、任意のデータベースプリンシパルまたはロールに割り当てることができ、所有権も譲渡できます。
- データをクエリまたは操作するための正しいオブジェクトスキーマを知る必要があるため、セキュリティの追加レイヤーが提供されます。スキーマおよびスキーマ所有オブジェクトへのアクセスを制御することもできます。