sys.sp_cdc_enable_table (Transact-SQL)

適用対象:SQL Server

現在のデータベース内の指定したソース テーブルを対象に変更データ キャプチャを有効にします。 テーブルで変更データ キャプチャが有効になっている場合、テーブルに適用された各データ操作言語 (DML) 操作のレコードがトランザクション ログに書き込まれます。 変更データ キャプチャ プロセスは、ログからこの情報を取得し、一連の関数を使用してアクセスされる変更テーブルに書き込みます。

変更データ キャプチャは、Microsoft SQL Server のすべてのエディッションで使用できるわけではありません。 SQL Serverの各エディションでサポートされる機能の一覧については、「 SQL Server 2016 の各エディションがサポートする機能」を参照してください。

Transact-SQL 構文表記規則

構文

  
sys.sp_cdc_enable_table   
  [ @source_schema = ] 'source_schema',   
  [ @source_name = ] 'source_name' ,  [,[ @capture_instance = ] 'capture_instance' ]  
  [,[ @supports_net_changes = ] supports_net_changes ]  
  , [ @role_name = ] 'role_name'  
  [,[ @index_name = ] 'index_name' ]  
  [,[ @captured_column_list = ] 'captured_column_list' ]  
  [,[ @filegroup_name = ] 'filegroup_name' ]  
  [,[ @allow_partition_switch = ] 'allow_partition_switch' ]  
  [;]  

引数

[ @source_schema = ] 'source_schema' ソース テーブルが属するスキーマの名前を指定します。 source_schemasysname で、既定値は指定せず、NULL にすることはできません。

[ @source_name = ] 'source_name' 変更データ キャプチャを有効にするソース テーブルの名前を指定します。 source_namesysname で、既定値は指定せず、NULL にすることはできません。

source_name は、現在のデータベースに存在する必要があります。 cdc スキーマ内のテーブルを変更データ キャプチャに対して有効にすることはできません。

[ @role_name = ] 'role_name' 変更データへのアクセスをゲートするために使用されるデータベース ロールの名前です。 role_namesysname であり、指定する必要があります。 明示的に NULL に設定した場合、変更データへのアクセスを制限する際にゲーティング ロールは使用されません。

ロールが現在存在する場合は、それが使用されます。 指定されたロールが存在しない場合は、その名前でデータベース ロールの作成が試行されます。 ロール名は、ロールの作成を試みる前に、文字列の右側にある空白でトリミングされます。 呼び出し元がデータベース内にロールを作成する権限がない場合、ストアド プロシージャの操作は失敗します。

[ @capture_instance = ] 'capture_instance' インスタンス固有の変更データ キャプチャ オブジェクトの名前を付けるために使用されるキャプチャ インスタンスの名前です。 capture_instancesysname であり、NULL にすることはできません。

指定しない場合、名前は、ソース スキーマ名とソース テーブル名の形式 schemaname_sourcenameから派生します。 capture_instance 100 文字を超えることはできません。データベース内で一意である必要があります。 指定するか派生したかに関係なく、 capture_instance は文字列の右側にある空白でトリミングされます。

ソース テーブルには、最大 2 つのキャプチャ インスタンスを含めることができます。 詳細については、「 sys.sp_cdc_help_change_data_capture (Transact-SQL)」を参照してください。

[ @supports_net_changes = ] supports_net_changes このキャプチャ インスタンスに対して、ネット変更のクエリのサポートを有効にするかどうかを示します。 supports_net_changesは、テーブルに主キーがある場合、またはテーブルに パラメーターを使用して@index_name識別された一意のインデックスがある場合、既定値は 1 のビットです。 それ以外の場合、既定値は 0 になります。

0 の場合、すべての変更に対してクエリを実行するサポート関数のみが生成されます。

1 の場合、ネット変更のクエリに必要な関数も生成されます。

supports_net_changesが 1 に設定されている場合は、index_nameを指定するか、ソース テーブルに定義された主キーが必要です。

[ @index_name = ] 'index_name_' ソース テーブル内の行を一意に識別するために使用する一意のインデックスの名前。 index_nameは sysname で、NULL にすることができます。 指定する場合、 index_name はソース テーブルの有効な一意のインデックスである必要があります。 index_nameが指定されている場合、識別されたインデックス列は、テーブルの一意の行識別子として、定義されている主キー列よりも優先されます。

[ @captured_column_list = ] 'captured_column_list' 変更テーブルに含めるソース テーブルの列を識別します。 captured_column_listnvarchar(max) であり 、NULL にすることができます。 NULL の場合、すべての列が変更テーブルに追加されます。

列名は、ソース テーブル内の有効な列である必要があります。 主キー インデックスで定義されている列、または index_name によって参照されるインデックスで定義されている列を含む必要があります。

captured_column_list は、列名のコンマ区切りのリストです。 リスト内の個々の列名は、必要に応じて、二重引用符 ("") または角かっこ ([]) を使用して引用符で囲むことができます。 列名にコンマが埋め込まれている場合は、列名を引用符で囲む必要があります。

captured_column_listは、__$start_lsn、__$end_lsn__$seqval、__$operation、および __$update_mask の予約列名を含めることはできません。

[ @filegroup_name = ] 'filegroup_name' キャプチャ インスタンス用に作成された変更テーブルに使用するファイル グループです。 filegroup_nameは sysname で、NULL を指定できます。 指定した場合、 filegroup_name は現在のデータベースに対して定義する必要があります。 NULL の場合は、既定のファイル グループが使用されます。

変更データ キャプチャの変更テーブル用に、別個のファイル グループを作成することをお勧めします。

[ @allow_partition_switch = ] 'allow_partition_switch' 変更データ キャプチャが有効になっているテーブルに対して ALTER TABLE の SWITCH PARTITION コマンドを実行できるかどうかを示します。 allow_partition_switchビットで、既定値は 1 です。

パーティション分割されていないテーブルの場合、スイッチの設定は常に 1 になり、実際の設定は無視されます。 非パーティション テーブルで切り替え設定を明示的に 0 に設定すると、切り替え設定が無視されたことを示す警告 22857 が生成されます。 パーティション テーブルで切り替え設定を明示的に 0 に設定すると、ソース テーブルに対するパーティションの切り替え操作が許可されなくなることを示す警告 22356 が生成されます。 最後に、スイッチ設定が明示的に 1 に設定されているか、既定で 1 に設定され、有効なテーブルがパーティション分割されている場合は、パーティション スイッチがブロックされないことを示す警告 22855 が発行されます。 パーティションの切り替えが発生した場合、変更データ キャプチャはスイッチの結果の変更を追跡しません。 変更データを使用すると、データの不整合が発生します。

重要

SWITCH PARTITION はメタデータ操作ですが、データの変更が発生します。 この操作に関連付けられているデータ変更は、変更データ キャプチャ変更テーブルにはキャプチャされません。 3 つのパーティションを持ち、このテーブルに変更が加えられたテーブルについて考えてみましょう。 キャプチャ プロセスでは、このテーブルに対して実行されるユーザーの挿入操作、更新操作、および削除操作を追跡します。 ただし、パーティションが別のテーブルに切り替えられた場合 (一括削除の実行など)、この操作の一部として移動された行は、変更テーブルには削除された行としてキャプチャされません。 同様に、既に行が作成されている新しいパーティションがテーブルに追加された場合、これらの行は変更テーブルには反映されません。 このため、変更がアプリケーションで使用され、変更先に適用されると、データの不整合が生じる可能性があります。

注意

SQL Server 2008 R2 から現在のバージョンまででパーティション切り替えを有効にすると、近い将来、分割操作とマージ操作が必要になる可能性があります。 レプリケートされたまたは CDC が有効なテーブルでの分割またはマージ操作を実行する前に、該当するパーティションに保留中のレプリケートされたコマンドがないことを確認します。 分割操作とマージ操作中にパーティションで DML 操作が実行されないようにする必要もあります。 ログ リーダーでも CDC キャプチャ ジョブでも処理されていないトランザクションがある場合や、分割操作またはマージ操作中に、レプリケートされたまたは CDC が有効なテーブルのパーティションで DML 操作が実行される場合 (同じパーティションに関連する場合)、ログ リーダー エージェントで処理エラー (エラー 608 - パーティション ID のカタログ エントリが見つからない) が発生する可能性があります。 このエラーを修正するには、サブスクリプションを再初期化するまたはそのテーブルまたはデータベース上で CDC を無効にすることが必要になる場合があります。

リターン コードの値

0 (成功) または 1 (失敗)

結果セット

なし

解説

変更データ キャプチャ用にテーブルを有効にする前に、データベースを有効にする必要があります。 データベースで変更データ キャプチャが有効になっているかどうかを確認するには、sys.databases カタログ ビューの is_cdc_enabled 列に対してクエリを実行します。 データベースを有効にするには、 sys.sp_cdc_enable_db ストアド プロシージャを使用します。

テーブルに対して変更データ キャプチャを有効にすると、変更テーブルと 1 つまたは 2 つのクエリ関数が生成されます。 変更テーブルは、キャプチャ プロセスによってトランザクション ログから抽出されたソース テーブルの変更に関するリポジトリとして機能します。 クエリ関数は、変更テーブルからデータを抽出するために使用されます。 これらの関数の名前は、次の方法で capture_instance パラメーターから派生します。

  • すべての変更関数: cdc.fn_cdc_get_all_changes_<capture_instance>

  • Net changes 関数: cdc.fn_cdc_get_net_changes_<capture_instance>

また、ソース テーブルが変更データ キャプチャを有効にするデータベースの最初のテーブルであり、データベースにトランザクション パブリケーションが存在しない場合は、sys.sp_cdc_enable_tableはデータベースのキャプチャ ジョブとクリーンアップ ジョブを作成します。 sys.tables カタログ ビューのis_tracked_by_cdc列を 1 に設定します。

注意

テーブルに対して変更データ キャプチャが有効になっている場合、SQL Server エージェントを実行する必要はありません。 ただし、キャプチャ プロセスはトランザクション ログを処理せず、SQL Server エージェントが実行されていない限り、変更テーブルにエントリを書き込みます。

アクセス許可

db_owner 固定データベース ロール内でメンバーシップが必要です。

A. 必要なパラメーターのみを指定して変更データ キャプチャを有効にする

次の例では、テーブルの変更データ キャプチャを HumanResources.Employee 有効にします。 必要なパラメーターのみが指定されます。

USE AdventureWorks2012;  
GO  
EXECUTE sys.sp_cdc_enable_table  
    @source_schema = N'HumanResources'  
  , @source_name = N'Employee'  
  , @role_name = N'cdc_Admin';  
GO  

B. 追加の省略可能なパラメーターを指定して変更データ キャプチャを有効にする

次の例では、テーブルの変更データ キャプチャを HumanResources.Department 有効にします。 を除く @allow_partition_switch すべてのパラメーターが指定されています。

USE AdventureWorks2012;  
GO  
EXEC sys.sp_cdc_enable_table  
    @source_schema = N'HumanResources'  
  , @source_name = N'Department'  
  , @role_name = N'cdc_admin'  
  , @capture_instance = N'HR_Department'   
  , @supports_net_changes = 1  
  , @index_name = N'AK_Department_Name'   
  , @captured_column_list = N'DepartmentID, Name, GroupName'   
  , @filegroup_name = N'PRIMARY';  
GO  

参照

sys.sp_cdc_disable_table (Transact-SQL)
sys.sp_cdc_help_change_data_capture (Transact-SQL)
<cdc.fn_cdc_get_all_changes_capture_instance> (Transact-SQL)
<cdc.fn_cdc_get_net_changes_capture_instance> (Transact-SQL)
sys.sp_cdc_help_jobs (Transact-SQL)