次の方法で共有


包含データベース

包含データベースは、他のデータベースと、データベースをホストする SQL Server のインスタンスから分離されたデータベースです。 SQL Server 2014 は、ユーザーが 4 つの方法でインスタンスからデータベースを分離するのに役立ちます。

  • データベースを記述するメタデータの多くは、データベースに保持されます。 (メタデータをマスターデータベースで管理することに加えて、またはその代わりに)。

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

  • ユーザー認証はデータベースによって実行でき、SQL Server のインスタンスのログインに対するデータベースの依存関係が減少します。

  • SQL Server 環境 (DMV、XEvent など) は、コンテインメント情報を報告し、処理できます。

部分的に含まれるデータベースの一部の機能 (データベースへのメタデータの格納など) は、すべての SQL Server 2014 データベースに適用されます。 データベース レベルの認証やカタログの照合順序など、部分的に含まれるデータベースの一部の利点は、使用できるようになる前に有効にする必要があります。 部分包含は、 CREATE DATABASE ステートメントと ALTER DATABASE ステートメントを使用するか、SQL Server Management Studio を使用して有効になります。 部分包含を有効にする方法の詳細については、「 部分包含データベースへの移行」を参照してください。

このトピックは、次のセクションで構成されています。

部分的に含まれるデータベースの概念

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

包含データベースは、包含に関して特徴を考慮します。 データベース内に存在する関数のみに依存するユーザー定義エンティティは、完全に含まれていると見なされます。 データベースの外部に存在する関数に依存するユーザー定義エンティティは、非包含と見なされます。 (詳細については、このトピックの後の 「包含」 セクションを参照してください)。

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

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

含ま れる
データベース境界全体に存在する要素。

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

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

部分的に収められたデータベース
部分的包含データベースは、データベース境界を越える一部の機能を許可できる包含データベースです。 SQL Server には、コンテインメント境界がいつ交差するかを判断する機能が含まれています。

制限されたユーザー
包含データベースには 2 種類のユーザーがあります。

  • パスワードを持つ制限付きデータベースユーザー

    パスワードを持つ包含データベース ユーザーは、データベースによって認証されます。

  • Windows プリンシパル

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

master データベース内のログインに基づくユーザーには、包含データベースへのアクセス権を付与できますが、SQL Server インスタンスへの依存関係が作成されます。 そのため、ログインに基づいてユーザーを作成する場合、部分的に含まれるデータベースに関するコメントを参照してください。

重要

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

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

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

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

封じ込め

データベース内に完全に存在するユーザー エンティティが 含まれていると見なされます。 データベースの外部に存在するエンティティ、またはデータベースの外部の関数との対話に依存するエンティティは、 非包含と見なされます。

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

  • データベースの境界をまったく越えることがない、完全に閉じ込められているユーザー エンティティ、例えば sys.indexes のようなもの。 これらの機能を使用するコードや、これらのエンティティのみを参照するオブジェクトも完全に含まれています。

  • sys.server_principalsやサーバー プリンシパル (ログイン) 自体など、非包含ユーザー エンティティ (データベース境界を越えるエンティティ)。 これらのエンティティを使用するコードや、これらのエンティティを参照する関数は含まれていない。

部分的に制限されたデータベース

包含データベース機能は現在、部分的に包含状態でのみ使用できます。 部分的包含データベースは、包含されていない機能を使用できる包含データベースです。

sys.dm_db_uncontained_entitiesおよび sys.sql_modules (Transact-SQL) ビューを使用して、非包含オブジェクトまたはフィーチャに関する情報を返します。 データベースの要素の包含状態を決定することで、包含を昇格させるために置換または変更する必要があるオブジェクトまたは特徴を検出できます。

重要

特定のオブジェクトには既定の包含設定 NONE があるため、このビューは誤検知を返すことができます。

部分包含データベースの動作は、照合順序に関して非包含データベースの動作と最も異なります。 照合順序の問題の詳細については、「 包含データベースの照合順序」を参照してください。

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

部分的に包含されたデータベースを使用して解決できる、非包含データベースに関連する問題と複雑さがあります。

データベースの移動

データベースの移動時に発生する問題の 1 つは、データベースをあるインスタンスから別のインスタンスに移動すると、いくつかの重要な情報が使用できなくなる可能性があるということです。 たとえば、ログイン情報はデータベースではなくインスタンス内に格納されます。 包含されていないデータベースを 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) を参照してください。

データベース非包含使用イベント

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

変更された機能 (包含データベース)

コンテインドデータベースの照合順序

包含データベースでのセキュリティのベスト プラクティス

部分的包含データベースへの移行