包含データベースContained Databases

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

" 包含データベース " は、他のデータベース、およびデータベースをホストする SQL ServerSQL Server のインスタンスから分離されたデータベースです。A contained database is a database that is isolated from other databases and from the instance of SQL ServerSQL Server that hosts the database. SQL Server 2017SQL Server 2017 では、ユーザーは 4 つの方法でインスタンスからデータベースを分離できます。helps user to isolate their database from the instance in 4 ways.

  • データベースを表すメタデータの多くはデータベースに保持されますMuch of the metadata that describes a database is maintained in the database. (master データベースのメタデータを保持する代わりに、またはそれに加えて保持されます)。(In addition to, or instead of, maintaining metadata in the master database.)

  • すべてのメタデータは、同じ照合順序を使用して定義されます。All metadata are defined using the same collation.

  • ユーザー認証をデータベースで実行して、 SQL ServerSQL Serverのインスタンスのログインに対するデータベースの依存を軽減できます。User authentication can be performed by the database, reducing the databases dependency on the logins of the instance of SQL ServerSQL Server.

  • SQL ServerSQL Server 環境 (DMV の XEvents など) は、包含情報をレポートおよび操作できます。The SQL ServerSQL Server environment (DMV's, XEvents, etc.) reports and can act upon containment information.

データベースへのメタデータの格納など、部分的包含データベースの一部の機能はすべての SQL Server 2017SQL Server 2017 データベースに適用されます。Some features of partially contained databases, such as storing metadata in the database, apply to all SQL Server 2017SQL Server 2017 databases. データベース レベル認証やカタログ照合順序など、部分的包含データベースの一部の利点を使用可能にするには、あらかじめこれらを有効にしておく必要があります。Some benefits of partially contained databases, such as database level authentication and catalog collation, must be enabled before they are available. 部分的包含は、 CREATE DATABASE ステートメントと ALTER DATABASE ステートメントを使用するか、 SQL Server Management StudioSQL Server Management Studioを使用して有効にします。Partial containment is enabled using the CREATE DATABASE and ALTER DATABASE statements or by using SQL Server Management StudioSQL Server Management Studio. 部分的データベース包含を有効にする方法の詳細については、「 Migrate to a Partially Contained Database」をご覧ください。For more information about how to enable partial database containment, see Migrate to a Partially Contained Database.

部分的包含データベースの概念Partially Contained Database Concepts

完全包含データベースには、すべての設定と、データベースを定義するために必要なメタデータが含まれており、データベースがインストールされている SQL Server データベース エンジンSQL Server Database Engine のインスタンスに対する構成上の依存関係がありません。A fully contained database includes all the settings and metadata required to define the database and has no configuration dependencies on the instance of the SQL Server データベース エンジンSQL Server Database Engine where the database is installed. 以前のバージョンの SQL ServerSQL Serverでは、データベースを SQL ServerSQL Server のインスタンスから分離するのには時間がかかる場合があり、データベースと SQL ServerSQL Serverのインスタンス間の関係に関する詳細な知識が必要でした。In previous versions of SQL ServerSQL Server, separating a database from the instance of SQL ServerSQL Server could be time consuming and required detailed knowledge of the relationship between the database and the instance of SQL ServerSQL Server. 部分的包含データベースを使用すると、 SQL ServerSQL Server のインスタンスと他のデータベースからデータベースを簡単に分離できるようになります。Partially contained databases make it easier to separate a database from the instance of SQL ServerSQL Server and other databases.

包含データベースでは、機能を包含という観点から考えます。The contained database considers features with regard to containment. データベース内の機能だけに依存しているすべてのユーザー定義エンティティは、完全に包含されていると見なされます。Any user-defined entity that relies only on functions that reside in the database is considered fully contained. データベースの外部の機能に依存しているすべてのユーザー定義エンティティは、包含されていないと見なされますAny user-defined entity that relies on functions that reside outside the database is considered uncontained. (詳細については、後の「 包含 」を参照してください)。(For more information, see the Containment section later in this topic.)

以下の用語は、包含データベース モデルに適用されます。The following terms apply to the contained database model.

データベース境界Database boundary
データベースと SQL ServerSQL Serverのインスタンスとの境界。The boundary between a database and the instance of SQL ServerSQL Server. データベースと他のデータベースとの境界。The boundary between a database and other databases.

包含Contained
完全にデータベース境界内に存在する要素。An element that exists entirely in the database boundary.

非包含Uncontained
データベース境界を越える要素。An element that crosses the database boundary.

非包含データベースNon-contained database
包含が NONEに設定されているデータベース。A database that has containment set to NONE. SQL Server 2012 (11.x)SQL Server 2012 (11.x) より前のバージョンのすべてのデータベースは、非包含です。All databases in versions earlier than SQL Server 2012 (11.x)SQL Server 2012 (11.x) are non-contained. 既定では、 SQL Server 2012 (11.x)SQL Server 2012 (11.x) 以降のすべてのデータベースの包含は NONEに設定されています。By default, all SQL Server 2012 (11.x)SQL Server 2012 (11.x) and later databases have a containment set to NONE.

部分的包含データベースPartially contained database
部分的包含データベースは、データベース境界を越えることが許可される包含データベースです。A partially contained database is a contained database that can allow some features that cross the database boundary. SQL ServerSQL Server には、包含の境界をいつ超えるかを判断する機能が含まれています。includes the ability to determine when the containment boundary is crossed.

包含ユーザーContained user
包含データベースには、2 種類のユーザーがあります。There are two types of users for contained databases.

  • パスワードを持つ包含データベース ユーザーContained database user with password

    パスワードを持つ包含データベース ユーザーは、データベースによって認証されます。Contained database users with passwords are authenticated by the database. 詳細については、「 包含データベース ユーザー - データベースの可搬性を確保する」を参照してください。For more information, see Contained Database Users - Making Your Database Portable.

  • Windows プリンシパルWindows principals

    承認済みの Windows ユーザーと、承認済みの Windows グループのメンバーは、データベースに直接接続でき、 master データベース内のログインを必要としません。Authorized Windows users and members of authorized Windows groups can connect directly to the database and do not need logins in the master database. データベースは、Windows による認証を信頼します。The database trusts the authentication by Windows.

master データベースへのログインに基づくユーザーには、包含データベースに対するアクセス許可を付与できますが、それによって SQL ServerSQL Server インスタンスとの依存関係が生成されます。Users based on logins in the master database can be granted access to a contained database, but that would create a dependency on the SQL ServerSQL Server instance. そのため、ログインに基づくユーザーを作成するには、部分的包含が必要です。Therefore, creating users based on logins requires partial containment.

重要

部分的包含データベースを有効にすると、 SQL ServerSQL Server のインスタンスへのアクセス制御がデータベースの所有者にデリゲートされます。Enabling partially contained databases delegates control over access to the instance of SQL ServerSQL Server to the owners of the database. 詳しくは、「 Security Best Practices with Contained Databases」をご覧ください。For more information, see Security Best Practices with Contained Databases.

データベース境界Database Boundary
部分的包含データベースはデータベースの機能をインスタンスの機能から分離するので、これらの 2 つの要素間には " データベース境界" と呼ばれる、明確に定義された区分線があります。Because partially contained databases separate the database functionality from those of the instance, there is a clearly defined line between these two elements called the database boundary.

データベース境界の内側は データベース モデルで、ここではデータベースが開発および管理されます。Inside of the database boundary is the database model, where the databases are developed and managed. データベース内にあるエンティティの例としては、 sys.tablesのようなシステム テーブル、パスワードを持つ包含データベース ユーザー、2 部構成の名前で参照されている現在のデータベース内のユーザー テーブルなどがあります。Examples of entities located inside of the database include, system tables like sys.tables, contained database users with passwords, and user tables in the current database referenced by a two-part name.

データベース境界の外側は " 管理モデル" で、ここではインスタンスレベルの機能と管理が扱われます。Outside of the database boundary is the management model, which pertains to instance-level functions and management. データベース境界の外にあるエンティティの例としては、 sys.endpointsのようなシステム テーブル、ログインにマップされているユーザー、3 部構成の名前で参照されている他のデータベース内のユーザー テーブルなどがあります。Examples of entities located outside of the database boundary include, system tables like sys.endpoints, users mapped to logins, and user tables in another database referenced by a three-part-name.

包含Containment

全体がデータベース内に存在しているユーザー エンティティは、 包含であると見なされます。User entities that reside entirely within the database are considered contained. データベースの外部に存在していたり、データベースの外部の機能とのやり取りに依存しているすべてのエンティティは、 非包含と見なされます。Any entities that reside outside of the database, or rely on interaction with functions outside of the database, are considered uncontained.

一般に、ユーザー エンティティは、以下の包含のカテゴリのいずれかに分類されます。In general, user entities fall into the following categories of containment:

  • 完全包含ユーザー エンティティ (データベース境界を越えることがないもの)。たとえば、sys.indexes。Fully contained user entities (those that never cross the database boundary), for example sys.indexes. これらの機能を使用するコードや、これらのエンティティのみを参照するオブジェクトも完全包含です。Any code that uses these features or any object that references only these entities is also fully contained.

  • 非包含ユーザー エンティティ (データベース境界を越えるもの)。たとえば、sys.server_principals やサーバー プリンシパル (ログイン) 自体。Uncontained user entities (those that cross the database boundary), for example sys.server_principals or a server principal (login) itself. これらのエンティティを使用するコードや、これらのエンティティを参照する機能は包含ではありません。Any code that uses these entities or any functions that references these entities are uncontained.

Partially Contained DatabasePartially Contained Database

包含データベースの機能は、現在、部分的包含状態のみで利用可能です。The contained database feature is currently available only in a partially contained state. 部分的包含データベースは、非包含機能の使用が許される包含データベースです。A partially contained database is a contained database that allows the use of uncontained features.

非包含オブジェクトまたは機能に関する情報を取得するには、sys.dm_db_uncontained_entities ビューおよび sys.sql_modules (Transact-SQL) ビューを使用します。Use the sys.dm_db_uncontained_entities and sys.sql_modules (Transact-SQL) view to return information about uncontained objects or features. データベースの要素の包含状態を確認することにより、包含を昇格させるためにどのオブジェクトまたは機能を置き換えたり変更したりする必要があるかを判断できます。By determining the containment status of the elements of your database, you can discover what objects or features must be replaced or altered to promote containment.

重要

一部のオブジェクトでは、既定の包含設定が NONEであるため、このビューは偽陽性の結果を返す場合があります。Because certain objects have a default containment setting of NONE, this view can return false positives.

部分的包含データベースの動作と非包含データベースの動作の違いが最も明らかなのが、照合順序の場合です。The behavior of partially contained databases differs most distinctly from that of non-contained databases with regard to collation. 照合順序の問題の詳細については、「 Contained Database Collations」をご覧ください。For more information about collation issues, see Contained Database Collations.

部分的包含データベースを使用する利点Benefits of using Partially Contained Databases

非包含データベースに関連している問題や複雑さの一部は、部分的包含データベースを使用することで解決できます。There are issues and complications associated with the non-contained databases that can be resolved by using a partially contained database.

データベースの移動Database Movement

データベースの移動時に発生する問題の 1 つは、データベースがあるインスタンスから別のインスタンスに移動されたときに、一部の重要情報が使用不能になる場合があることです。One of the problems that occurs when moving databases, is that some important information can be unavailable when a database is moved from one instance to another. たとえば、ログイン情報がデータベースではなくインスタンスに保存されます。For example, login information is stored within the instance instead of in the database. 非包含データベースを SQL ServerSQL Serverのインスタンスから別のインスタンスに移動すると、この情報は後に残されます。When you move a non-contained database from one instance to another instance of SQL ServerSQL Server, this information is left behind. 欠落情報を特定し、データベースと一緒に SQL ServerSQL Serverの新しいインスタンスに移動する必要があります。You must identify the missing information and move it with your database to the new instance of SQL ServerSQL Server. この処理は、困難で時間がかかる場合があります。This process can be difficult and time-consuming.

部分包含データベースには、データベース内の重要情報を格納できるため、移動後もデータベースには情報が含まれます。The partially contained database can store important information in the database so the database still has the information after it is moved.

注意

部分包含データベースでは、インスタンスから分離できないデータベースで使用される機能を記述するドキュメントを提供できます。A partially contained database can provide documentation describing those features that are used by a database that cannot be separated from the instance. これには、他の相互関連データベースの一覧や、データベースに必要だが含めることのできないシステム設定などが含まれます。This includes a list of other interrelated databases, system settings that the database requires but cannot be contained, and so on.

AlwaysOn の包含データベース ユーザーの利点Benefit of Contained Database Users with Always On

SQL ServerSQL Serverのインスタンスとの結び付きを低減することで、部分的包含データベースは Always On 可用性グループAlways On availability groupsを使用する場合のフェールオーバー時に役立つことがあります。By reducing the ties to the instance of SQL ServerSQL Server, partially contained databases can be useful during failover when you use Always On 可用性グループAlways On availability groups.

包含ユーザーを作成すると、そのユーザーは包含データベースに直接接続できます。Creating contained users enables the user to connect directly to the contained database. これは、AlwaysOn ソリューションなどの高可用性およびディザスター リカバリーのシナリオにおいて非常に重要な機能です。This is a very significant feature in high availability and disaster recovery scenarios such as in an Always On solution. ユーザーが包含ユーザーである場合は、フェールオーバーが発生したときに、セカンダリ データベースをホストするインスタンスのログインを作成せずに、セカンダリ データベースに接続できます。If the users are contained users, in case of failover, people would be able to connect to the secondary without creating logins on the instance hosting the secondary. これは直接的な利益をもたらします。This provides an immediate benefit. 詳細については、「 Always On 可用性グループの概要 (SQL Server) 」およおび「 Always On 可用性グループの前提条件、制限事項、推奨事項 (SQL Server)」をご覧ください。For more information, see Overview of Always On Availability Groups (SQL Server) and Prerequisites, Restrictions, and Recommendations for Always On Availability Groups (SQL Server).

初期のデータベース開発Initial Database Development

開発者は新しいデータベースが配置される場所を把握していない場合があるため、配置先の環境がデータベースに及ぼす影響を少なくすることで、開発者の作業や懸案事項が軽減されます。Because a developer may not know where a new database will be deployed, limiting the deployed environmental impacts on the database lessens the work and concern for the developer. 非包含モデルでは、開発者は新しいデータベースが環境から受ける影響の可能性を考慮して、それに応じたプログラミングをする必要があります。In the non-contained model, the developer must consider possible environmental impacts on the new database and program accordingly. しかし、部分的包含データベースを使用することによって、開発者はデータベースに対するインスタンス レベルの影響と、開発者のインスタンス レベルの懸案事項を検出できます。However, by using partially contained databases, developers can detect instance-level impacts on the database and instance-level concerns for the developer.

データベースの管理Database Administration

データベース設定を master データベースではなくデータベースに保持すると、データベース所有者に sysadmin 権限を付与しなくても、各データベース所有者は自身のデータベースをより高度に管理できます。Maintaining database settings in the database, instead of in the master database, lets each database owner have more control over their database, without giving the database owner sysadmin permission.

制限事項Limitations

部分的包含データベースでは、以下の機能は許可されません。Partially contained databases do not allow the following features.

  • 部分的包含データベースは、レプリケーション、変更データ キャプチャ、または変更の追跡を使用できません。Partially contained databases cannot use replication, change data capture, or change tracking.

  • 番号付きプロシージャNumbered procedures

  • 照合順序の変更を伴う、組み込み関数に依存するスキーマ バインド オブジェクト。Schema-bound objects that depend on built-in functions with collation changes

  • オブジェクト、列、記号、または型への参照など、照合順序の変更によるバインドの変更。Binding change resulting from collation changes, including references to objects, columns, symbols, or types.

  • レプリケーション、変更データ キャプチャ、および変更の追跡。Replication, change data capture, and change tracking.

警告

一時ストアド プロシージャは、現在許可されています。Temporary stored procedures are currently permitted. 一時ストアド プロシージャは包含関係に違反するので、将来のバージョンの包含データベースではサポートされない予定です。Because temporary stored procedures breach containment, they are not expected to be supported in future versions of contained database.

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

データベースの包含状態を識別するのに役立つ 2 つのツールがあります。There are two tools to help identify the containment status of the database. sys.dm_db_uncontained_entities (Transact-SQL) は、データベース内には含まれていない可能性があるすべてのエンティティを示すビューです。The sys.dm_db_uncontained_entities (Transact-SQL) is a view that shows all the potentially uncontained entities in the database. 実行時に、実際に含まれていないエンティティが識別されると、database_uncontained_usage イベントが発生します。The database_uncontained_usage event occurs when any actual uncontained entity is identified at run time.

sys.dm_db_uncontained_entitiessys.dm_db_uncontained_entities

このビューには、データベース内には含まれていない可能性があるエンティティ (データベース境界を越えるエンティティなど) が表示されます。This view shows any entities in the database that have the potential to be uncontained, such as those that cross-the database boundary. こうしたエンティティには、データベース モデル外部のオブジェクトを使用するユーザー エンティティが含まれます。This includes those user entities that may use objects outside the database model. ただし、一部のエンティティ (たとえば、動的 SQL を使用するエンティティ) の包含は実行時まで識別できないため、このビューでは、実際に含まれていないエンティティ以外のエンティティが表示される場合があります。However, because the containment of some entities (for example, those using dynamic SQL) cannot be determined until run time, the view may show some entities that are not actually uncontained. 詳細については、「sys.dm_db_uncontained_entities (Transact-SQL)」を参照してください。For more information, see sys.dm_db_uncontained_entities (Transact-SQL).

database_uncontained_usage イベントdatabase_uncontained_usage event

この XEvent は、実行時に、含まれていないエンティティが識別されると発生します。This XEvent occurs whenever an uncontained entity is identified at run time. これには、クライアント コードで生成されたエンティティが含まれます。This includes entities originated in client code. この Xevent は、実際に含まれていないエンティティに対してのみ発生します。This XEvent will occur only for actual uncontained entities. ただし、このイベントが発生するのは実行時のみです。However, the event only occurs at run time. したがって、まだ実行されていない場合、含まれていないユーザー エンティティはこの XEvent で識別されません。Therefore, any uncontained user entities you have not run will not be identified by this XEvent

参照See Also

変更された機能 (包含データベース) Modified Features (Contained Database)
Contained Database Collations Contained Database Collations
Security Best Practices with Contained Databases Security Best Practices with Contained Databases
Migrate to a Partially Contained Database Migrate to a Partially Contained Database
包含データベース ユーザー - データベースの可搬性を確保するContained Database Users - Making Your Database Portable