sys.sp_cdc_enable_table (Transact-SQL)

適用対象: はいSQL Server (サポートされているすべてのバージョン)

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

変更データ キャプチャは、 MicrosoftSQL 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 (SQL)」を参照してください。

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

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

1の場合、差分変更のクエリを実行するために必要な関数も生成されます。

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

[ @index_name = ] 'index_name_' ソーステーブル内の行を一意に識別するために使用する一意のインデックスの名前。 index_namesysname であり、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_namesysname であり、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 (失敗)

結果セット

なし

解説

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

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

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

  • 差分変更機能: cdc.fn_cdc_get_net_changes_<capture_instance>

また sys.sp_cdc_enable_table は、変更データキャプチャを有効にするデータベースの最初のテーブルがソーステーブルで、データベースにトランザクションパブリケーションが存在しない場合に、データベースのキャプチャジョブとクリーンアップジョブを作成します。 この例では、 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 SQL)
sys.sp_cdc_help_change_data_capture (transact-sql SQL)
cdc.fn_cdc_get_all_changes_<capture_instance> (transact-sql SQL
cdc.fn_cdc_get_net_changes_<capture_instance> (transact-sql SQL
sys.sp_cdc_help_jobs (transact-sql SQL)