次の方法で共有


変更データ キャプチャの有効化と無効化 (SQL Server)

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

データベースの変更データ キャプチャを有効にする

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

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

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

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

重要

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

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

データベースの変更データ キャプチャを無効にする

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

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

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

重要

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

-- =======  
-- Disable Database for Change Data Capture template   
-- =======  
USE MyDB  
GO  
EXEC sys.sp_cdc_disable_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 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.

名前付きのロールの目的は、変更データへのアクセスを制御することです。 指定されるロールは、既存の固定サーバー ロールの場合もデータベース ロールの場合もあります。 指定したロールがまだ存在しない場合は、その名前のデータベース ロールが自動的に作成されます。 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 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.

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

テーブルの変更データ キャプチャを無効にする

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

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

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

-- =====  
-- 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  

こちらもご覧ください

データ変更の追跡 (SQL Server)
変更データ キャプチャについて (SQL Server)
変更データの管理 (SQL Server)
変更データ キャプチャの管理と監視 (SQL Server)