包含データベース
包含データベースとは、他のデータベースや、データベースをホストするSQL Serverのインスタンスから分離されたデータベースです。 SQL Server 2014 は、ユーザーが 4 つの方法でデータベースをインスタンスから分離するのに役立ちます。
データベースを表すメタデータの多くはデータベースに保持されます (master データベースのメタデータを保持する代わりに、またはそれに加えて保持されます)。
すべてのメタデータは、同じ照合順序を使用して定義されます。
ユーザー認証をデータベースで実行して、 SQL Serverのインスタンスのログインに対するデータベースの依存を軽減できます。
SQL Server 環境 (DMV の XEvents など) は、包含情報をレポートおよび操作できます。
部分的に含まれるデータベースの一部の機能 (データベースへのメタデータの格納など) は、すべてのSQL Server 2014 データベースに適用されます。 データベース レベル認証やカタログ照合順序など、部分的包含データベースの一部の利点を使用可能にするには、あらかじめこれらを有効にしておく必要があります。 部分包含は、 ステートメントと ALTER DATABASE
ステートメントをCREATE DATABASE
使用するか、SQL Server Management Studioを使用して有効になります。 部分的データベース包含を有効にする方法の詳細については、「 Migrate to a Partially Contained Database」をご覧ください。
このトピックは、次のセクションで構成されています。
部分的包含データベースの概念
完全包含データベースには、すべての設定と、データベースを定義するために必要なメタデータが含まれており、データベースがインストールされている SQL Server データベース エンジン のインスタンスに対する構成上の依存関係がありません。 以前のバージョンの SQL Serverでは、データベースを SQL Server のインスタンスから分離するのには時間がかかる場合があり、データベースと SQL Serverのインスタンス間の関係に関する詳細な知識が必要でした。 部分的包含データベースを使用すると、 SQL Server のインスタンスと他のデータベースからデータベースを簡単に分離できるようになります。
包含データベースでは、機能を包含という観点から考えます。 データベース内の機能だけに依存しているすべてのユーザー定義エンティティは、完全に包含されていると見なされます。 データベースの外部の機能に依存しているすべてのユーザー定義エンティティは、包含されていないと見なされます (詳細については、後の「 包含 」を参照してください)。
以下の用語は、包含データベース モデルに適用されます。
データベース境界
データベースと SQL Serverのインスタンスとの境界。 データベースと他のデータベースとの境界。
包含
完全にデータベース境界内に存在する要素。
非包含
データベース境界を越える要素。
非包含データベース
包含が NONEに設定されているデータベース。 SQL Server 2012 より前のバージョンのすべてのデータベースは、非包含です。 既定では、2012 以降のすべてのデータベースSQL Server包含が 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 ソリューションなどの高可用性およびディザスター リカバリーのシナリオにおいて非常に重要な機能です。 ユーザーが包含ユーザーである場合は、フェールオーバーが発生したときに、セカンダリ データベースをホストするインスタンスのログインを作成せずに、セカンダリ データベースに接続できます。 これは直接的な利益をもたらします。 詳細については、「AlwaysOn 可用性グループの概要 (SQL Server)」および「AlwaysOn 可用性グループの前提条件、制限事項、推奨事項 (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 で識別されません。