変更データ キャプチャの有効化と無効化 (SQL Server)Enable and Disable Change Data Capture (SQL Server)

適用対象: ○SQL Server ○Azure SQL Database (Managed Instance のみ) ×Azure SQL Data Warehouse ×Parallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database (Managed Instance only) noAzure SQL Data Warehouse noParallel Data Warehouse

このトピックでは、データベースおよびテーブルに対して変更データ キャプチャを有効または無効にする方法について説明します。This topic describes how to enable and disable change data capture for a database and a table.

データベースでの変更データ キャプチャの有効化Enable Change Data Capture for a Database

個々のテーブルに対してキャプチャ インスタンスを作成する前に、 sysadmin 固定サーバー ロールのメンバーがデータベースで変更データ キャプチャを有効にする必要があります。Before a capture instance can be created for individual tables, a member of the sysadmin fixed server role must first enable the database for change data capture. これは、データベース コンテキストでストアド プロシージャ sys.sp_cdc_enable_db (Transact-SQL) を実行することにより行われます。This is done by running the stored procedure sys.sp_cdc_enable_db (Transact-SQL) in the database context. データベースが既に有効であるかどうかを確認するには、sys.databases カタログ ビューの is_cdc_enabled 列に対してクエリを実行します。To determine if a database is already enabled, query the is_cdc_enabled column in the sys.databases catalog view.

データベースで変更データ キャプチャを有効にすると、 cdc スキーマ、 cdc ユーザー、メタデータ テーブル、その他のシステム オブジェクトがデータベースに作成されます。When a database is enabled for change data capture, the cdc schema, cdc user, metadata tables, and other system objects are created for the database. cdc スキーマには、変更データ キャプチャ メタデータ テーブルが含まれています。ソース テーブルで変更データ キャプチャを有効にした後には、変更データのリポジトリとして機能する個々の変更テーブルも含まれます。The cdc schema contains the change data capture metadata tables and, after source tables are enabled for change data capture, the individual change tables serve as a repository for change data. cdc スキーマには、変更データのクエリの実行に使用する関連のシステム関数も含まれています。The cdc schema also contains associated system functions used to query for change data.

変更データ キャプチャでは、 cdc スキーマと cdc ユーザーを専用で使用することが必要です。Change data capture requires exclusive use of the cdc schema and cdc user. cdc という名前のスキーマやデータベース ユーザーが現在データベースに存在する場合は、そのスキーマやユーザーを削除するか、名前を変更しないと、そのデータベースで変更データ キャプチャを有効にすることはできません。If either a schema or a database user named cdc currently exists in a database, the database cannot be enabled for change data capture until the schema and or user are dropped or renamed.

データベースの有効化の例については、データベースでの変更データ キャプチャの有効化のテンプレートを参照してください。See the Enable Database for Change Data Capture template for an example of enabling a database.

重要

SQL Server Management StudioSQL Server Management Studioでこのテンプレートを見つけるには、 [表示] メニューの [テンプレート エクスプローラー] をクリックし、 [SQL Server テンプレート] を選択します。To locate the templates in SQL Server Management StudioSQL Server Management Studio, go to View, click Template Explorer, and then select SQL Server Templates. Change Data Capture はサブフォルダーです。Change Data Capture is a sub-folder. このトピックで参照したすべてのテンプレートは、このフォルダー内にあります。Under this folder, you will find all the templates referenced in this topic. ツール バーには [テンプレート エクスプローラー] SQL Server Management StudioSQL Server Management Studio アイコンもあります。There is also a Template Explorer icon on the SQL Server Management StudioSQL Server Management Studio toolbar.

-- ====  
-- Enable Database for CDC template   
-- ====  
USE MyDB  
GO  
EXEC sys.sp_cdc_enable_db  
GO  

データベースでの変更データ キャプチャの無効化Disable Change Data Capture for a Database

sysadmin 固定サーバー ロールのメンバーは、データベース コンテキストでストアド プロシージャ sys.sp_cdc_disable_db (Transact-SQL) を実行し、データベースの変更データ キャプチャを無効にすることができます。A member of the sysadmin fixed server role can run the stored procedure sys.sp_cdc_disable_db (Transact-SQL) in the database context to disable change data capture for a database. データベースを無効にする前に個々のテーブルを無効にする必要はありません。It is not necessary to disable individual tables before you disable the database. データベースを無効にすると、 cdc ユーザー、スキーマ、変更データ キャプチャ ジョブなど、関連するすべての変更データ キャプチャ メタデータが削除されます。Disabling the database removes all associated change data capture metadata, including the cdc user and schema and the change data capture jobs. ただし、変更データ キャプチャによって作成されたゲーティング ロールは自動的には削除されないので、明示的に削除する必要があります。However, any gating roles created by change data capture will not be removed automatically and must be explicitly deleted. データベースが有効になっているかどうかを確認するには、sys.databases カタログ ビューの is_cdc_enabled 列に対してクエリを実行します。To determine if a database is enabled, query the is_cdc_enabled column in the sys.databases catalog view.

変更データ キャプチャが有効になっているデータベースを削除すると、変更データ キャプチャ ジョブも自動的に削除されます。If a change data capture enabled database is dropped, change data capture jobs are automatically removed.

データベースの無効化の例については、データベースでの変更データ キャプチャの無効化のテンプレートを参照してください。See the Disable Database for Change Data Capture template for an example of disabling a database.

重要

SQL Server Management StudioSQL Server Management Studioでこのテンプレートを見つけるには、 [表示][テンプレート エクスプローラー][SQL Server テンプレート] の順にクリックします。To locate the templates in SQL Server Management StudioSQL Server Management Studio, go to View, click Template Explorer, and then click SQL Server Templates. Change Data Capture は、このトピックで参照されるすべてのテンプレートを含んだサブフォルダーです。Change Data Capture is a sub-folder where you will find all the templates that are referenced in this topic. ツール バーには [テンプレート エクスプローラー] SQL Server Management StudioSQL Server Management Studio アイコンもあります。There is also a Template Explorer icon on the SQL Server Management StudioSQL Server Management Studio toolbar.

-- =======  
-- Disable Database for Change Data Capture template   
-- =======  
USE MyDB  
GO  
EXEC sys.sp_cdc_disable_db  
GO  

テーブルでの変更データ キャプチャの有効化Enable Change Data Capture for a Table

データベースで変更データ キャプチャを有効にすると、 db_owner 固定データベース ロールのメンバーはストアド プロシージャ sys.sp_cdc_enable_tableを使用して個々のソース テーブルに対してキャプチャ インスタンスを作成できるようになります。After a database has been enabled for change data capture, members of the db_owner fixed database role can create a capture instance for individual source tables by using the stored procedure sys.sp_cdc_enable_table. ソース テーブルで変更データ キャプチャが既に有効にされているかどうかを確認するには、 sys.tables カタログ ビューの is_tracked_by_cdc 列を調べます。To determine whether a source table has already been enabled for change data capture, examine the is_tracked_by_cdc column in the sys.tables catalog view.

キャプチャ インスタンスの作成時に、次のオプションを指定できます。The following options can be specified when creating a capture instance:

キャプチャするソース テーブルの列Columns in the source table to be captured.

既定では、ソース テーブルのすべての列がキャプチャ対象列として識別されます。By default, all of the columns in the source table are identified as captured columns. プライバシーやパフォーマンス上の理由で、列のサブセットのみを追跡する場合は、 *@captured_column_list* パラメーターを使用して列のサブセットを指定します。If only a subset of columns need to be tracked, such as for privacy or performance reasons, use the *@captured_column_list* parameter to specify the subset of columns.

変更テーブルを含むファイル グループ。A filegroup to contain the change table.

既定では、変更テーブルはデータベースの既定のファイル グループにあります。By default, the change table is located in the default filegroup of the database. データベース所有者が個々の変更テーブルの場所を制御するには、 *@filegroup_name* パラメーターを使用して、キャプチャ インスタンスに関連付けられている変更テーブルに対して特定のファイル グループを指定します。Database owners who want to control the placement of individual change tables can use the *@filegroup_name* parameter to specify a particular filegroup for the change table associated with the capture instance. 指定するファイル グループはあらかじめ存在している必要があります。The named filegroup must already exist. 通常、変更テーブルはソース テーブルとは別のファイル グループに配置することをお勧めします。Generally, it is recommended that change tables be placed in a filegroup separate from source tables. ゲーティング ロールなしでテーブルを有効にする例については、 **@filegroup_name** パラメーターの使用例については、 *@filegroup_name* のテンプレートをご覧ください。See the Enable a Table Specifying Filegroup Option template for an example showing use of the *@filegroup_name* parameter.

-- =========  
-- Enable a Table Specifying Filegroup Option Template  
-- =========  
USE MyDB  
GO  
  
EXEC sys.sp_cdc_enable_table  
@source_schema = N'dbo',  
@source_name   = N'MyTable',  
@role_name     = N'MyRole',  
@filegroup_name = N'MyDB_CT',  
@supports_net_changes = 1  
GO  

変更テーブルへのアクセスを制御するためのロール。A role for controlling access to a change table.

名前付きのロールの目的は、変更データへのアクセスを制御することです。The purpose of the named role is to control access to the change data. 指定されるロールは、既存の固定サーバー ロールの場合もデータベース ロールの場合もあります。The specified role can be an existing fixed server role or a database role. 指定のロールが存在しない場合は、その名前のデータベース ロールが自動的に作成されます。If the specified role does not already exist, a database role of that name is created automatically. sysadmin ロールのメンバーと db_owner ロールのメンバーには、変更テーブルのデータへのフル アクセス権が与えられます。Members of either the sysadmin or db_owner role have full access to the data in the change tables. 他のすべてのユーザーには、ソース テーブルのすべてのキャプチャ対象列に対する SELECT 権限が必要です。All other users must have SELECT permission on all the captured columns of the source table. さらに、ロールが指定されている場合、 sysadmin ロールと db_owner ロールのいずれのメンバーでもないユーザーも、指定のロールのメンバーである必要があります。In addition, when a role is specified, users who are not members of either the sysadmin or db_owner role must also be members of the specified role.

ゲーティング ロールを使用しない場合は、 *@role_name* パラメーターを明示的に NULL に設定する必要があります。If you do not want to use a gating role, explicitly set the *@role_name* parameter to NULL. ゲーティング ロールなしでテーブルを有効にする例については、 ゲーティング ロールなしでのテーブルの有効化 のテンプレートをご覧ください。See the Enable a Table Without Using a Gating Role template for an example of enabling a table without a gating role.

-- =========  
-- Enable a Table Without Using a Gating Role template   
-- =========  
USE MyDB  
GO  
EXEC sys.sp_cdc_enable_table  
@source_schema = N'dbo',  
@source_name   = N'MyTable',  
@role_name     = NULL,  
@supports_net_changes = 1  
GO  
  

差分変更を照会するための関数。A function to query for net changes.

キャプチャ インスタンスには、定義した期間内に発生したすべての変更テーブル エントリを返すためのテーブル値関数が常に含まれています。A capture instance will always include a table valued function for returning all change table entries that occurred within a defined interval. この関数の名前は、"cdc.fn_cdc_get_all_changes_" の後ろにキャプチャ インスタンス名を付加したものです。This function is named by appending the capture instance name to "cdc.fn_cdc_get_all_changes_". 詳細については、「cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)」を参照してください。For more information, see cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL).

*@supports_net_changes* パラメーターを 1 に設定すると、キャプチャ インスタンスに対して差分変更追跡の関数も生成されます。If the parameter *@supports_net_changes* is set to 1, a net changes function is also generated for the capture instance. この関数では、呼び出しで指定した期間内に変更された各行についてそれぞれ 1 つの変更のみが返されます。This function returns only one change for each distinct row changed in the interval specified in the call. 詳細については、「cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)」を参照してください。For more information, see cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL).

差分変更のクエリをサポートするには、行を一意に識別するための主キーまたは一意のインデックスがソース テーブルに必要です。To support net changes queries, the source table must have a primary key or unique index to uniquely identify rows. 一意のインデックスを使用する場合は、 *@index_name* のテンプレートをご覧ください。If a unique index is used, the name of the index must be specified using the *@index_name* parameter. 主キーまたは一意のインデックスで定義した列は、キャプチャするソース列の一覧に含まれている必要があります。The columns defined in the primary key or unique index must be included in the list of source columns to be captured.

両方のクエリ関数を使用したキャプチャ インスタンスの作成例については、 テーブルでのすべての変更クエリと差分変更クエリの有効化 のテンプレートを参照してください。See the Enable a Table for All and Net Changes Queries template for an example demonstrating the creation of a capture instance with both query functions.

-- =============  
-- Enable a Table for All and Net Changes Queries template   
-- =============  
USE MyDB  
GO  
EXEC sys.sp_cdc_enable_table  
@source_schema = N'dbo',  
@source_name   = N'MyTable',  
@role_name     = N'MyRole',  
@supports_net_changes = 1  
GO  

注意

既存の主キーのあるテーブルで変更データ キャプチャが有効化され、代替となる一意のインデックスの識別に *@index_name* パラメーターが使用されていない場合、変更データ キャプチャ機能では主キーが使用されます。If change data capture is enabled on a table with an existing primary key, and the *@index_name* parameter is not used to identify an alternative unique index, the change data capture feature will use the primary key. その後は、テーブルの変更データ キャプチャを無効にしてからでなければ、主キーに変更を加えることはできません。Subsequent changes to the primary key will not be allowed without first disabling change data capture for the table. これは、変更データ キャプチャの構成時に差分変更のクエリのサポートが要求されたかどうかには関係ありません。This is true regardless of whether support for net changes queries was requested when change data capture was configured. 変更データ キャプチャが有効化された時点でテーブルに主キーがない場合、その後追加された主キーは変更データ キャプチャでは無視されます。If there is no primary key on a table at the time it is enabled for change data capture, the subsequent addition of a primary key is ignored by change data capture. 変更データ キャプチャでは、テーブルで変更データ キャプチャが有効化された後で作成された主キーは使用しないので、キーおよびキー列は制限なく削除できます。Because change data capture will not use a primary key that is created after the table was enabled, the key and key columns can be removed without restrictions.

テーブルでの変更データ キャプチャの無効化Disable Change Data Capture for a Table

db_owner 固定データベース ロールのメンバーは、ストアド プロシージャ sys.sp_cdc_disable_tableを使用して個々のソース テーブルのキャプチャ インスタンスを削除できます。Members of the db_owner fixed database role can remove a capture instance for individual source tables by using the stored procedure sys.sp_cdc_disable_table. ソース テーブルで変更データ キャプチャが現在有効になっているかどうかを確認するには、 sys.tables カタログ ビューの is_tracked_by_cdc 列を調べます。To determine whether a source table is currently enabled for change data capture, examine the is_tracked_by_cdc column in the sys.tables catalog view. 無効化の後、データベースに対して有効なテーブルがない場合は、変更データ キャプチャ ジョブも削除されます。If there are no tables enabled for the database after the disabling takes place, the change data capture jobs are also removed.

変更データ キャプチャが有効になっているテーブルを削除すると、そのテーブルに関連する変更データ キャプチャ メタデータも自動的に削除されます。If a change data capture-enabled table is dropped, change data capture metadata that is associated with the table is automatically removed.

テーブルの無効化の例については、テーブルでのキャプチャ インスタンスの無効化のテンプレートを参照してください。See the Disable a Capture Instance for a Table template for an example of disabling a table.

-- =====  
-- Disable a Capture Instance for a Table template   
-- =====  
USE MyDB  
GO  
EXEC sys.sp_cdc_disable_table  
@source_schema = N'dbo',  
@source_name   = N'MyTable',  
@capture_instance = N'dbo_MyTable'  
GO  

参照See Also

データ変更の追跡 (SQL Server) Track Data Changes (SQL Server)
変更データ キャプチャについて (SQL Server) About Change Data Capture (SQL Server)
変更データの処理 (SQL Server) Work with Change Data (SQL Server)
変更データ キャプチャの管理と監視 (SQL Server)Administer and Monitor Change Data Capture (SQL Server)