次の方法で共有


変更データ キャプチャの有効化

このトピックでは、データベースおよびテーブルに対して変更データ キャプチャを有効にする方法について説明します。

データベースでの変更データ キャプチャの有効化

個々のテーブルに対してキャプチャ インスタンスを作成する前に、sysadmin 固定サーバー ロールのメンバがデータベースで変更データ キャプチャを有効にする必要があります。これは、データベース コンテキストでストアド プロシージャ sys.sp_cdc_enable_db (Transact-SQL) を実行することにより行われます。この機能がデータベースで既に有効にされているかどうかを確認するには、sys.databases カタログ ビューの is_cdc_enabled 列をクエリします。

データベースで変更データ キャプチャを有効にすると、cdc スキーマ、cdc ユーザー、メタデータ テーブル、およびその他のシステム オブジェクトがデータベースに対して作成されます。cdc スキーマには、変更データ キャプチャのメタデータ テーブルが含まれています。ソース テーブルで変更データ キャプチャを有効にした後には、変更データのリポジトリとして機能する個々の変更テーブルも含まれます。cdc スキーマには変更データのクエリの実行に使用する関連のシステム関数も含まれています。

変更データ キャプチャでは、cdc スキーマと cdc ユーザーを排他的に使用する必要があります。cdc という名前のスキーマやデータベース ユーザーが現在データベースに存在する場合は、そのスキーマやユーザーを削除するか、名前を変更しないと、そのデータベースで変更データ キャプチャを有効にすることはできません。

データベースの有効化の例については、データベースでの変更データ キャプチャの有効化のテンプレートを参照してください。

重要な注意事項重要

SQL Server Management Studio でこのテンプレートを見つけるには、[表示] メニューの [テンプレート エクスプローラ] をクリックし、[SQL Server テンプレート] を選択します。Change Data Capture はサブフォルダです。このトピックで参照したすべてのテンプレートは、このフォルダ内にあります。SQL Server Management Studio ツール バーには [テンプレート エクスプローラ] アイコンもあります。

-- ================================

-- Enable Database for CDC のテンプレート

-- ================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_db
GO

テーブルでの変更データ キャプチャの有効化

データベースで変更データ キャプチャが有効にされると、db_owner 固定データベース ロールのメンバはストアド プロシージャ sys.sp_cdc_enable_table を使用して個々のソース テーブルに対してキャプチャ インスタンスを作成できるようになります。ソース テーブルで変更データ キャプチャが既に有効にされているかどうかを確認するには、sys.tables カタログ ビューの is_tracked_by_cdc 列を調べます。

キャプチャ インスタンスの作成時に、次のオプションを指定できます。

Columns in the source table to be captured.

既定では、ソース テーブルのすべての列がキャプチャ対象列として識別されます。プライバシーやパフォーマンス上の理由で、列のサブセットのみを追跡する場合は、@captured_column_list パラメータを使用して列のサブセットを指定します。

A filegroup to contain the change table.

既定では、変更テーブルはデータベースの既定のファイル グループにあります。データベース所有者が個々の変更テーブルの場所を制御するには、@filegroup_name パラメータを使用して、キャプチャ インスタンスに関連付けられている変更テーブルに対して特定のファイル グループを指定します。指定するファイル グループはあらかじめ存在している必要があります。通常、変更テーブルはソース テーブルとは別のファイル グループに配置することをお勧めします。@filegroup_name パラメータの使用例については、Enable a Table Specifying Filegroup Option のテンプレートを参照してください。

===================================================

-- Enable a Table Specifying Filegroup Option のテンプレート

-- ===================================================

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.

名前付きのロールの目的は、変更データへのアクセスを制御することです。指定されるロールは、既存の固定サーバー ロールの場合もデータベース ロールの場合もあります。指定のロールが存在しない場合は、その名前のデータベース ロールが自動的に作成されます。sysadmin ロールのメンバと db_owner ロールのメンバには、変更テーブルのデータへのフル アクセス権が与えられます。他のすべてのユーザーには、ソース テーブルのすべてのキャプチャ対象列に対する SELECT 権限が必要です。さらに、ロールが指定されている場合、sysadmin ロールまたは db_owner ロールのいずれのメンバでもないユーザーも、指定のロールのメンバである必要があります。

ゲーティング ロールを使用しない場合は、@role_name パラメータを明示的に NULL に設定する必要があります。ゲーティング ロールなしでテーブルを有効にする例については、Enable a Table Without Using a Gating Role のテンプレートを参照してください。

-- ===================================================

-- Enable a Table Without Using a Gating Role のテンプレート

-- ===================================================

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.

キャプチャ インスタンスには、定義した期間内に発生したすべての変更テーブル エントリを返すためのテーブル値関数が常に含まれています。この関数の名前は、"cdc.fn_cdc_get_all_changes_" の後ろにキャプチャ インスタンス名を付加したものです。詳細については、「cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL)」を参照してください。

@supports\_net\_changes パラメータを 1 に設定すると、キャプチャ インスタンスに対して差分変更追跡の関数も生成されます。この関数では、呼び出しで指定した期間内に変更された各行についてそれぞれ 1 つの変更のみが返されます。詳細については、「cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)」を参照してください。

差分変更のクエリをサポートするには、行を一意に識別するための主キーまたは一意のインデックスがソース テーブルに必要です。一意のインデックスを使用する場合は、@index_name パラメータを使用してインデックスの名前を指定する必要があります。主キーまたは一意のインデックスで定義した列は、キャプチャするソース列の一覧に含まれている必要があります。

両方のクエリ関数を使用したキャプチャ インスタンスの作成例については、Enable a Table for All and Net Changes Queries のテンプレートを参照してください。

=======================================================

-- Enable a Table for All and Net Changes Queries のテンプレート

-- =======================================================

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 パラメータが使用されていない場合、変更データ キャプチャ機能では主キーが使用されます。その後は、テーブルの変更データ キャプチャを無効にしてからでなければ、主キーに変更を加えることはできません。これは、変更データ キャプチャの構成時に差分変更のクエリのサポートが要求されたかどうかには関係ありません。変更データ キャプチャが有効化された時点でテーブルに主キーがない場合、その後追加された主キーは変更データ キャプチャでは無視されます。変更データ キャプチャでは、テーブルで変更データ キャプチャが有効化された後で作成された主キーは使用しないので、キーおよびキー列は制限なく削除できます。