包含データベース

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

包含データベース は、他のデータベース、およびデータベースをホストするのインスタンスから分離されたデータベースです。 SQL Server では、ユーザーは 4 つの方法でインスタンスからデータベースを分離できます。

  • データベースを表すメタデータの多くはデータベースに保持されます (master データベースのメタデータを保持する代わりに、またはそれに加えて保持されます)。

  • すべてのメタデータは、同じ照合順序を使用して定義されます。

  • ユーザー認証をデータベースで実行して、SQL Server のインスタンスのログインに対するデータベースの依存を軽減できます。

  • SQL Server 環境 (DMV の XEvents など) は、包含情報をレポートおよび操作できます。

データベースへのメタデータの格納など、部分的包含データベースの一部の機能はすべての SQL Server データベースに適用されます。 データベース レベル認証やカタログ照合順序など、部分的包含データベースの一部の利点を使用可能にするには、あらかじめこれらを有効にしておく必要があります。 部分的包含は、 CREATE DATABASE ステートメントと ALTER DATABASE ステートメントを使用するか、SQL Server Management Studio を使用して有効にします。 部分的データベース包含を有効にする方法の詳細については、「 Migrate to a Partially Contained Database」をご覧ください。

部分的包含データベースの概念

完全包含データベースには、すべての設定と、データベースを定義するために必要なメタデータが含まれており、データベースがインストールされている SQL Server データベース エンジンのインスタンスに対する構成上の依存関係がありません。 以前のバージョンの SQL Server では、データベースをSQL Server のインスタンスから分離するのには時間がかかる場合があり、データベースと のインスタンス間の関係に関する詳細な知識が必要でした。 部分的包含データベースを使用すると、SQL Server のインスタンスと他のデータベースからデータベースを簡単に分離できるようになります。

包含データベースでは、機能を包含という観点から考えます。 データベース内の機能だけに依存しているすべてのユーザー定義エンティティは、完全に包含されていると見なされます。 データベースの外部の機能に依存しているすべてのユーザー定義エンティティは、包含されていないと見なされます (詳細については、後の「 包含 」を参照してください)。

以下の用語は、包含データベース モデルに適用されます。

データベース境界
データベースと SQL Server のインスタンスとの境界。 データベースと他のデータベースとの境界。

包含
完全にデータベース境界内に存在する要素。

非包含
データベース境界を越える要素。

非包含データベース
包含が NONEに設定されているデータベース。 SQL Server 2012 (11.x) より前のバージョンのすべてのデータベースは、非包含です。 既定では、SQL Server 2012 (11.x) 以降のすべてのデータベースの包含は NONE に設定されています。

部分的包含データベース
部分的包含データベースは、データベース境界を越えることが許可される包含データベースです。 SQL Server には、包含の境界をいつ超えるかを判断する機能が含まれています。

包含ユーザー
包含データベースには、2 種類のユーザーがあります。

  • パスワードを持つ包含データベース ユーザー

    パスワードを持つ包含データベース ユーザーは、データベースによって認証されます。 詳細については、「包含データベース ユーザー - データベースの可搬性を確保する」を参照してください。

  • Windows プリンシパル

    承認済みの Windows ユーザーと、承認済みの Windows グループのメンバーは、データベースに直接接続でき、 master データベース内のログインを必要としません。 データベースは、Windows による認証を信頼します。

master データベースへのログインに基づくユーザーには、包含データベースに対するアクセス許可を付与できますが、それによって SQL Server インスタンスとの依存関係が生成されます。 そのため、ログインに基づくユーザーを作成するには、部分的包含が必要です。

重要

部分的包含データベースを有効にすると、SQL Server のインスタンスへのアクセス制御がデータベースの所有者にデリゲートされます。 詳細については、「 Security Best Practices with Contained Databases」を参照してください。

データベース境界
部分的包含データベースはデータベースの機能をインスタンスの機能から分離するので、これらの 2 つの要素間には " データベース境界" と呼ばれる、明確に定義された区分線があります。

データベース境界の内側は データベース モデルで、ここではデータベースが開発および管理されます。 データベース内にあるエンティティの例としては、 sys.tablesのようなシステム テーブル、パスワードを持つ包含データベース ユーザー、2 部構成の名前で参照されている現在のデータベース内のユーザー テーブルなどがあります。

データベース境界の外側は " 管理モデル" で、ここではインスタンスレベルの機能と管理が扱われます。 データベース境界の外にあるエンティティの例としては、 sys.endpointsのようなシステム テーブル、ログインにマップされているユーザー、3 部構成の名前で参照されている他のデータベース内のユーザー テーブルなどがあります。

Containment

全体がデータベース内に存在しているユーザー エンティティは、 包含であると見なされます。 データベースの外部に存在していたり、データベースの外部の機能とのやり取りに依存しているすべてのエンティティは、 非包含と見なされます。

一般に、ユーザー エンティティは、以下の包含のカテゴリのいずれかに分類されます。

  • 完全包含ユーザー エンティティ (データベース境界を越えることがないもの)。たとえば、sys.indexes。 これらの機能を使用するコードや、これらのエンティティのみを参照するオブジェクトも完全包含です。

  • 非包含ユーザー エンティティ (データベース境界を越えるもの)。たとえば、sys.server_principals やサーバー プリンシパル (ログイン) 自体。 これらのエンティティを使用するコードや、これらのエンティティを参照する機能は包含ではありません。

部分的包含データベース

包含データベースの機能は、現在、部分的包含状態のみで利用可能です。 部分的包含データベースは、非包含機能の使用が許される包含データベースです。

非包含オブジェクトまたは機能に関する情報を取得するには、sys.dm_db_uncontained_entities ビューおよび sys.sql_modules (Transact-SQL) ビューを使用します。 データベースの要素の包含状態を確認することにより、包含を昇格させるためにどのオブジェクトまたは機能を置き換えたり変更したりする必要があるかを判断できます。

重要

一部のオブジェクトでは、既定の包含設定が NONEであるため、このビューは偽陽性の結果を返す場合があります。

部分的包含データベースの動作と非包含データベースの動作の違いが最も明らかなのが、照合順序の場合です。 照合順序の問題の詳細については、「 Contained Database Collations」をご覧ください。

部分的包含データベースを使用する利点

非包含データベースに関連している問題や複雑さの一部は、部分的包含データベースを使用することで解決できます。

データベースの移動

データベースの移動時に発生する問題の 1 つは、データベースがあるインスタンスから別のインスタンスに移動されたときに、一部の重要情報が使用不能になる場合があることです。 たとえば、ログイン情報がデータベースではなくインスタンスに保存されます。 非包含データベースを SQL Server のあるインスタンスから別のインスタンスに移動すると、この情報は後に残されます。 欠落情報を特定し、データベースと一緒に SQL Server の新しいインスタンスに移動する必要があります。 この処理は、困難で時間がかかる場合があります。

部分包含データベースには、データベース内の重要情報を格納できるため、移動後もデータベースには情報が含まれます。

注意

部分包含データベースでは、インスタンスから分離できないデータベースで使用される機能を記述するドキュメントを提供できます。 これには、他の相互関連データベースの一覧や、データベースに必要だが含めることのできないシステム設定などが含まれます。

AlwaysOn の包含データベース ユーザーの利点

SQL Server のインスタンスとの結び付きを低減することで、部分的包含データベースは Always On 可用性グループを使用する場合のフェールオーバー時に役立つことがあります。

包含ユーザーを作成すると、そのユーザーは包含データベースに直接接続できます。 これは、AlwaysOn ソリューションなどの高可用性およびディザスター リカバリーのシナリオにおいて非常に重要な機能です。 ユーザーが包含ユーザーである場合は、フェールオーバーが発生したときに、セカンダリ データベースをホストするインスタンスのログインを作成せずに、セカンダリ データベースに接続できます。 これは直接的な利益をもたらします。 詳細については、「 Always On 可用性グループの概要 (SQL Server) 」およおび「 Always On 可用性グループの前提条件、制限事項、推奨事項 (SQL Server)」をご覧ください。

初期のデータベース開発

開発者は新しいデータベースが配置される場所を把握していない場合があるため、配置先の環境がデータベースに及ぼす影響を少なくすることで、開発者の作業や懸案事項が軽減されます。 非包含モデルでは、開発者は新しいデータベースが環境から受ける影響の可能性を考慮して、それに応じたプログラミングをする必要があります。 しかし、部分的包含データベースを使用することによって、開発者はデータベースに対するインスタンス レベルの影響と、開発者のインスタンス レベルの懸案事項を検出できます。

データベースの管理

データベース設定を master データベースではなくデータベースに保持すると、データベース所有者に sysadmin 権限を付与しなくても、各データベース所有者は自身のデータベースをより高度に管理できます。

制限事項

部分的包含データベースでは、以下の機能は許可されません。

  • レプリケーション、変更データ キャプチャ、または変更の追跡。

  • 番号付きプロシージャ

  • 照合順序の変更を伴う、組み込み関数に依存するスキーマ バインド オブジェクト。

  • オブジェクト、列、記号、または型への参照など、照合順序の変更によるバインドの変更。

警告

一時ストアド プロシージャは、現在許可されています。 一時ストアド プロシージャは包含関係に違反するので、将来のバージョンの包含データベースではサポートされない予定です。

データベースの包含状態の識別

データベースの包含状態を識別するのに役立つ 2 つのツールがあります。 sys.dm_db_uncontained_entities (Transact-SQL) は、データベース内には含まれていない可能性があるすべてのエンティティを示すビューです。 実行時に、実際に含まれていないエンティティが識別されると、database_uncontained_usage イベントが発生します。

sys.dm_db_uncontained_entities

このビューには、データベース内には含まれていない可能性があるエンティティ (データベース境界を越えるエンティティなど) が表示されます。 こうしたエンティティには、データベース モデル外部のオブジェクトを使用するユーザー エンティティが含まれます。 ただし、一部のエンティティ (たとえば、動的 SQL を使用するエンティティ) の包含は実行時まで識別できないため、このビューでは、実際に含まれていないエンティティ以外のエンティティが表示される場合があります。 詳細については、「sys.dm_db_uncontained_entities (Transact-SQL)」を参照してください。

database_uncontained_usage イベント

この XEvent は、実行時に、含まれていないエンティティが識別されると発生します。 これには、クライアント コードで生成されたエンティティが含まれます。 この Xevent は、実際に含まれていないエンティティに対してのみ発生します。 ただし、このイベントが発生するのは実行時のみです。 したがって、まだ実行されていない場合、含まれていないユーザー エンティティはこの XEvent で識別されません。

参照

変更された機能 (包含データベース)
包含データベースの照合順序
包含データベースでのセキュリティのベスト プラクティス
部分的包含データベースへの移行
包含データベース ユーザー - データベースの可搬性を確保する