sql >> データベース >  >> RDS >> Sqlserver

SQLServerでのデータベーススキーマの使用

    この記事では、データベーススキーマとは何か、その利点、および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などのシステムスキーマを削除することはできません。

    データベーススキーマを使用する利点

    • データベーススキーマは、データベースに論理オブジェクトグループを作成する柔軟性を提供します。複数のチームが同じデータベースで作業している場合、オブジェクトを分離するためにさまざまなスキーマを設計できます。
    • データベーススキーマは、データベース全体へのアクセスを提供する代わりに、それぞれのスキーマのユーザーへのアクセスを制御できるため、データベースの専門家がアクセスを管理するのに役立ちます。
    • 複数のスキーマ内の同じオブジェクトを異なる論理グループとして表示できるため、データベースをより効率的に管理できます。
    • 異なるスキーマ内でオブジェクトをすばやく移動できます。
    • スキーマの所有権は、任意のデータベースプリンシパルまたはロールに割り当てることができ、所有権も譲渡できます。
    • データをクエリまたは操作するための正しいオブジェクトスキーマを知る必要があるため、セキュリティの追加レイヤーが提供されます。スキーマおよびスキーマ所有オブジェクトへのアクセスを制御することもできます。

    1. PHP-ログインシステムでメンバー専用ページを保護する

    2. Oracle 11gで2つの日付の間の日数を取得するにはどうすればよいですか?

    3. SQL Server(T-SQL)で特定の言語に使用されている日付形式を見つける方法

    4. MySQLエラーの回避ロックを取得しようとしたときにデッドロックが見つかりました。トランザクションを再開してみてください