変更データ キャプチャを有効および無効にする

適用対象:SQL ServerAzure SQL Managed Instance

この記事では、SQL Server と Azure SQL Managed Instance のデータベースとテーブルの変更データ キャプチャ (CDC) を有効および無効にする方法について説明します。 Azure SQL Database については、「Azure SQL Database での CDC」を参照してください。

アクセス許可

SQL Server と Azure SQL Managed Instance で変更データ キャプチャを有効または無効にするには、sysadmin アクセス許可が必要です。

データベースに対して有効にする

個々のテーブルに対してキャプチャ インスタンスを作成する前に、データベースで変更データ キャプチャを有効にする必要があります。

変更データ キャプチャを有効にするには、データベース コンテキストでストアド プロシージャ sys.sp_cdc_enable_db (Transact-SQL) を実行します。 データベースで CDC が既に有効になっているかどうかを確認するには、 カタログ ビューの sys.databases 列に対してクエリを実行します。

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

変更データ キャプチャでは、 cdc スキーマと cdc ユーザーを専用で使用することが必要です。 cdc という名前のスキーマまたはデータベース ユーザーのどちらかが現在データベースに存在する場合は、当該のスキーマやユーザーの削除または名前の変更が行われるまで、そのデータベースで変更データ キャプチャを有効にすることはできません。

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

SQL Server Management Studio で CDC 関連のテンプレートを見つけるには、[表示] に移動して [テンプレート エクスプローラー] を選択してから、[SQL Server テンプレート] を選択します。 変更データ キャプチャは、テンプレートを含むサブフォルダーです

データベースに対して無効にする

データベース コンテキストで sys.sp_cdc_disable_db (Transact-SQL)を使用して、データベースの変更データ キャプチャを無効にします。 データベースで CDC を無効にする前に個々のテーブルで CDC を無効にする必要はありません。 データベースで CDC を無効にすると、cdc ユーザー、スキーマ、変更データ キャプチャ ジョブなど、関連するすべての変更データ キャプチャ メタデータが削除されます。 ただし、CDC によって作成されたゲーティング ロールは自動的に削除されず、明示的に削除する必要があります。 データベースで CDC が有効になっているかどうかを確認するには、 カタログ ビューの sys.databases 列に対してクエリを実行します。

CDC が有効になっているデータベースを削除すると、変更データ キャプチャ ジョブは自動的に削除されます。

-- Disable Database for change data capture
USE MyDB
GO
EXEC sys.sp_cdc_disable_db
GO

テーブルに対して有効にする

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

重要

sys.sp_cdc_enable_table ストアド プロシージャの引数の詳細については、「sys.sp_cdc_enable_table (Transact-SQL)」を参照してください。

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

キャプチャ対象のソース テーブルの列

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

変更テーブルを含むファイル グループ。

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

-- Enable CDC for a table specifying filegroup
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

変更テーブルへのアクセスを制御するためのロール。

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

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

-- Enable CDC for a table using a gating role option
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

差分変更を照会するための関数。

キャプチャ インスタンスには、定義した期間内に発生したすべての変更テーブル エントリを返すためのテーブル値関数(TVF)が常に含まれています。 この関数の名前は、`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 CDC for 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 パラメーターが使用されていない場合、変更データ キャプチャ機能では主キーが使用されます。 その後は、テーブルの変更データ キャプチャを無効にしてからでなければ、主キーに変更を加えることはできません。 これは、変更データ キャプチャの構成時に差分変更のクエリのサポートが要求されたかどうかには関係ありません。 変更データ キャプチャが有効化された時点でテーブルに主キーがない場合、その後追加された主キーは変更データ キャプチャでは無視されます。 変更データ キャプチャでは、テーブルで変更データ キャプチャが有効化された後で作成された主キーは使用しないので、キーおよびキー列は制限なく削除できます。

テーブルに対して無効にする

db_owner 固定データベース ロールのメンバーは、ストアド プロシージャ sys.sp_cdc_disable_table を使って個々のソース テーブルのキャプチャ インスタンスを削除できます。 ソース テーブルで変更データ キャプチャが現在有効にされているかどうかを確認するには、is_tracked_by_cdc カタログ ビューの sys.tables 列を調べます。 無効化の後、データベースに対して有効なテーブルがない場合は、変更データ キャプチャ ジョブも削除されます。

変更データ キャプチャが有効になっているテーブルを削除すると、そのテーブルに関連する変更データ キャプチャ メタデータも自動的に削除されます。

テーブルの無効化の例については、テーブルでのキャプチャ インスタンスの無効化のテンプレートを参照してください。

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