sys.sp_cdc_enable_table (Transact-SQL)

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

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

トピック リンク アイコン 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_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 を指定した場合、そのインデックス列は、テーブルの一意な行識別子 (ROWID) として、定義済みのすべての主キー列よりも優先されます。

  • [ @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 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)