sys.sp_cdc_enable_table (Transact-SQL)

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

変更データ キャプチャは、SQL Server 2008 Enterprise Edition、Developer Edition、および Evaluation Edition でのみ使用できます。

トピック リンク アイコンTransact-SQL 構文表記規則

構文

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

引数

  • [ @source_schema = ] 'source_schema'
    ソース テーブルが属しているスキーマの名前を指定します。source_schema のデータ型は sysname で、既定値はありません。NULL 値は許可されません。

  • [ @source_name = ] 'source_name'
    変更データ キャプチャを有効にするソース テーブルの名前を指定します。source_name のデータ型は sysname で、既定値はありません。NULL 値は許可されません。

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

  • [ @role_name = ] 'role_name'
    変更データへのアクセスに使用するデータベース ロールの名前を指定します。role_name のデータ型は sysname です。このロール名は必ず指定してください。明示的に NULL に設定した場合、変更データへのアクセスを制限する際にゲーティング ロールは使用されません。

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

  • [ @capture_instance = ] 'capture_instance'
    インスタンス固有の変更データ キャプチャ オブジェクトを識別するために使用されるキャプチャ インスタンスの名前を指定します。capture_instance のデータ型は sysname で、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 のデータ型は bit です。主キーがテーブルに含まれている場合、または @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_list のデータ型は nvarchar(max) で、NULL 値が許可されます。NULL の場合、すべての列が変更テーブルに追加されます。

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

    captured_column_list には、列名をコンマ区切りで指定します。個々の列名は、二重引用符 ("") または角かっこ ([]) で囲んで指定することもできます。列名そのものにコンマが含まれる場合は、列名をこれらの記号で囲んで指定する必要があります。

    __$start_lsn__$end_lsn__$seqval__$operation__$update_mask の各列名は予約されています。captured_column_list にこれらの列名を含めることはできません。

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

    変更データ キャプチャの変更テーブル用に、別個のファイル グループを作成することをお勧めします。詳細については、「変更データ キャプチャの構成」を参照してください。

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

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

    重要な注意事項重要

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

リターン コード値

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

結果セット

なし

説明

テーブルに対して変更データ キャプチャを有効にする前に、データベースに対して変更データ キャプチャを有効にする必要があります。データベースで変更データ キャプチャが有効になっているかどうかを確認するには、sys.databases カタログ ビューの 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 を実行すると、そのデータベース用のキャプチャ ジョブおよびクリーンアップ ジョブが作成されます。sys.tables カタログ ビューの is_tracked_by_cdc 列が 1 に設定されます。

注意

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

権限

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

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

次の例では、HumanResources.Employee テーブルに対して変更データ キャプチャを有効にします。指定されているのは、必須のパラメーターだけです。

USE AdventureWorks2008R2;
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 AdventureWorks2008R2;
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