sys.sp_cdc_enable_table (Transact-SQL)sys.sp_cdc_enable_table (Transact-SQL)

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) 適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions)

現在のデータベース内の指定したソース テーブルを対象に変更データ キャプチャを有効にします。Enables change data capture for the specified source table in the current database. テーブルで変更データキャプチャが有効になっている場合、テーブルに適用された各データ操作言語 (DML) 操作のレコードがトランザクションログに書き込まれます。When a table is enabled for change data capture, a record of each data manipulation language (DML) operation applied to the table is written to the transaction log. 変更データキャプチャプロセスでは、この情報をログから取得し、一連の関数を使用してアクセスする変更テーブルに書き込みます。The change data capture process retrieves this information from the log and writes it to change tables that are accessed by using a set of functions.

変更データ キャプチャは、 MicrosoftMicrosoftSQL ServerSQL Serverのすべてのエディッションで使用できるわけではありません。Change data capture is not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. SQL ServerSQL Serverの各エディションでサポートされる機能の一覧については、「 SQL Server 2016 の各エディションがサポートする機能」を参照してください。For a list of features that are supported by the editions of SQL ServerSQL Server, see Features Supported by the Editions of SQL Server 2016.

トピック リンク アイコン Transact-SQL 構文表記規則Topic link icon Transact-SQL Syntax Conventions

構文Syntax

  
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' ]  
  [;]  

引数Arguments

[ @source_schema = ] 'source_schema'ソーステーブルが属しているスキーマの名前を指定します。[ @source_schema = ] 'source_schema' Is the name of the schema in which the source table belongs. source_schemasysnameであり、既定値はありません。 NULL にすることはできません。source_schema is sysname, with no default, and cannot be NULL.

[ @source_name = ] 'source_name'変更データキャプチャを有効にするソーステーブルの名前を指定します。[ @source_name = ] 'source_name' Is the name of the source table on which to enable change data capture. source_namesysnameであり、既定値はありません。 NULL にすることはできません。source_name is sysname, with no default, and cannot be NULL.

source_nameは、現在のデータベースに存在している必要があります。source_name must exist in the current database. Cdcスキーマのテーブルでは、変更データキャプチャを有効にできません。Tables in the cdc schema cannot be enabled for change data capture.

[ @role_name = ] 'role_name'変更データへのアクセスをゲートするために使用するデータベースロールの名前を指定します。[ @role_name = ] 'role_name' Is the name of the database role used to gate access to change data. role_namesysnameであるため、指定する必要があります。role_name is sysname and must be specified. 明示的に NULL に設定した場合、変更データへのアクセスを制限する際にゲーティング ロールは使用されません。If explicitly set to NULL, no gating role is used to limit access to the change data.

ロールが現在存在する場合は、そのロールが使用されます。If the role currently exists, it is used. 指定されたロールが存在しない場合は、その名前でデータベース ロールの作成が試行されます。If the role does not exist, an attempt is made to create a database role with the specified name. ロール名は、ロールの作成を試行する前に、文字列の右側にある空白の領域から削除されます。The role name is trimmed of white space at the right of the string before attempting to create the role. 呼び出し元がデータベース内のロールを作成する権限を持っていない場合、ストアドプロシージャの操作は失敗します。If the caller is not authorized to create a role within the database, the stored procedure operation fails.

[ @capture_instance = ] 'capture_instance'インスタンス固有の変更データキャプチャオブジェクトに名前を指定するために使用されるキャプチャインスタンスの名前を指定します。[ @capture_instance = ] 'capture_instance' Is the name of the capture instance used to name instance-specific change data capture objects. capture_instancesysnameであり、NULL にすることはできません。capture_instance is sysname and cannot be NULL.

指定しない場合、ソーススキーマ名とソーステーブル名をschemaname_sourcenameの形式で取得した名前になります。If not specified, the name is derived from the source schema name plus the source table name in the format schemaname_sourcename. capture_instanceは100文字を超えることはできず、データベース内で一意である必要があります。capture_instance cannot exceed 100 characters and must be unique within the database. 指定されたまたは派生したかどうかにかかわらず、 capture_instance文字列の右側にある空白文字が切り捨てられます。Whether specified or derived, capture_instance is trimmed of any white space to the right of the string.

ソーステーブルには、最大2つのキャプチャインスタンスを含めることができます。A source table can have a maximum of two capture instances. 詳細については、「 sp_cdc_help_change_data_capture (transact-sql)」を参照してください。For more information see, sys.sp_cdc_help_change_data_capture (Transact-SQL).

[ @supports_net_changes = ] supports_net_changes差分変更のクエリのサポートをこのキャプチャインスタンスで有効にするかどうかを示します。[ @supports_net_changes = ] supports_net_changes Indicates whether support for querying for net changes is to be enabled for this capture instance. テーブルに主キーがある場合、またはテーブルにパラメーターを使用して識別された一意のインデックスがある場合、 supports_net_changesビットの既定値は1です @index_name 。supports_net_changes is bit with a default of 1 if the table has a primary key or the table has a unique index that has been identified by using the @index_name parameter. それ以外の場合、既定値は 0 になります。Otherwise, the parameter defaults to 0.

0の場合は、すべての変更をクエリするサポート関数のみが生成されます。If 0, only the support functions to query for all changes are generated.

1の場合、差分変更のクエリを実行するために必要な関数も生成されます。If 1, the functions that are needed to query for net changes are also generated.

Supports_net_changesが1に設定されている場合は、 index_nameを指定するか、ソーステーブルに主キーが定義されている必要があります。If supports_net_changes is set to 1, index_name must be specified, or the source table must have a defined primary key.

[ @index_name = ] 'index_name_'ソーステーブル内の行を一意に識別するために使用する一意のインデックスの名前。[ @index_name = ] 'index_name_' The name of a unique index to use to uniquely identify rows in the source table. index_namesysnameであり、NULL にすることができます。index_name is sysname and can be NULL. 指定した場合、 index_nameソーステーブルの有効な一意のインデックスである必要があります。If specified, index_name must be a valid unique index on the source table. Index_nameが指定されている場合、特定のインデックス列は、テーブルの一意の行識別子として、定義されている主キー列よりも優先されます。If index_name is specified, the identified index columns takes precedence over any defined primary key columns as the unique row identifier for the table.

[ @captured_column_list = ] 'captured_column_list'変更テーブルに含めるソーステーブルの列を指定します。[ @captured_column_list = ] 'captured_column_list' Identifies the source table columns that are to be included in the change table. captured_column_listnvarchar (max) であり、NULL を指定できます。captured_column_list is nvarchar(max) and can be NULL. NULL の場合、すべての列が変更テーブルに追加されます。If NULL, all columns are included in the change table.

列名は、ソーステーブル内の有効な列である必要があります。Column names must be valid columns in the source table. 主キーインデックスで定義されている列、またはindex_nameによって参照されるインデックスで定義されている列を含める必要があります。Columns defined in a primary key index, or columns defined in an index referenced by index_name must be included.

captured_column_listは、列名のコンマ区切りの一覧です。captured_column_list is a comma-separated list of column names. リスト内の個々の列名は、二重引用符 ("") または角かっこ ([]) のいずれかを使用して、オプションで引用符で囲むことができます。Individual column names within the list can be optionally quoted by using either double quotation marks ("") or square brackets ([]). 列名にコンマが埋め込まれている場合は、列名を引用符で囲む必要があります。If a column name contains an embedded comma, the column name must be quoted.

captured_column_listには、次の予約された列名を含めることはできません: __ $ start_lsn__ $ end_lsn__ $ seqval__ $ operation__ $ update_maskcaptured_column_list cannot contain the following reserved column names: __$start_lsn, __$end_lsn, __$seqval, __$operation, and __$update_mask.

[ @filegroup_name = ] 'filegroup_name'キャプチャインスタンスに対して作成された変更テーブルに使用するファイルグループを指定します。[ @filegroup_name = ] 'filegroup_name' Is the filegroup to be used for the change table created for the capture instance. filegroup_namesysnameであり、NULL にすることができます。filegroup_name is sysname and can be NULL. 指定した場合、現在のデータベースに対してfilegroup_nameが定義されている必要があります。If specified, filegroup_name must be defined for the current database. NULL の場合、既定のファイルグループが使用されます。If NULL, the default filegroup is used.

変更データ キャプチャの変更テーブル用に、別個のファイル グループを作成することをお勧めします。We recommend creating a separate filegroup for change data capture change tables.

[ @allow_partition_switch = ] 'allow_partition_switch'変更データキャプチャが有効になっているテーブルに対して ALTER TABLE の SWITCH PARTITION コマンドを実行できるかどうかを示します。[ @allow_partition_switch = ] 'allow_partition_switch' Indicates whether the SWITCH PARTITION command of ALTER TABLE can be executed against a table that is enabled for change data capture. allow_partition_switchビット,、既定値は1です。allow_partition_switch is bit, with a default of 1.

非パーティションテーブルの場合、スイッチの設定は常に1であり、実際の設定は無視されます。For nonpartitioned tables, the switch setting is always 1, and the actual setting is ignored. 非パーティション テーブルで切り替え設定を明示的に 0 に設定すると、切り替え設定が無視されたことを示す警告 22857 が生成されます。If the switch is explicitly set to 0 for a nonpartitioned table, warning 22857 is issued to indicate that the switch setting has been ignored. パーティション テーブルで切り替え設定を明示的に 0 に設定すると、ソース テーブルに対するパーティションの切り替え操作が許可されなくなることを示す警告 22356 が生成されます。If the switch is explicitly set to 0 for a partitioned table, the warning 22356 is issued to indicate that partition switch operations on the source table will be disallowed. 最後に、スイッチ設定が明示的に1に設定されているか、既定で1に設定されていて、有効になっているテーブルがパーティション分割されている場合は、パーティションスイッチがブロックされないことを示す警告22855が発行されます。Finally, if the switch setting is either set explicitly to 1 or allowed to default to 1 and the enabled table is partitioned, warning 22855 is issued to indicate that partition switches will not be blocked. パーティションの切り替えが発生した場合、変更データキャプチャでは、スイッチによって生じる変更は追跡されません。If any partition switches occur, change data capture will not track the changes resulting from the switch. これにより、変更データの使用時にデータの不整合が発生します。This will cause data inconsistencies when the change data is consumed.

重要

SWITCH PARTITION はメタデータの操作ですが、データの変更が発生します。SWITCH PARTITION is a metadata operation, but it causes data changes. この操作に関連付けられているデータの変更は、変更データキャプチャの変更テーブルにはキャプチャされません。The data changes that are associated with this operation are not captured in the change data capture change tables. 3つのパーティションがあり、このテーブルに変更が加えられたテーブルについて考えてみます。Consider a table that has three partitions, and changes are made to this table. キャプチャ プロセスでは、このテーブルに対して実行されるユーザーの挿入操作、更新操作、および削除操作を追跡します。The capture process will track user insert, update, and delete operations that are executed against the table. ただし、パーティションが別のテーブルに切り替えられた場合 (一括削除の実行など)、この操作の一部として移動された行は、変更テーブルには削除された行としてキャプチャされません。However, if a partition is switched out to another table (for example, to perform a bulk delete), the rows that were moved as part of this operation will not be captured as deleted rows in the change table. 同様に、既に行が作成されている新しいパーティションがテーブルに追加された場合、これらの行は変更テーブルには反映されません。Similarly, if a new partition that has prepopulated rows is added to the table, these rows will not be reflected in the change table. このため、変更がアプリケーションで使用され、変更先に適用されると、データの不整合が生じる可能性があります。This can cause data inconsistency when the changes are consumed by an application and applied to a destination.

リターン コードの値Return Code Values

0 (成功) または1 (失敗)0 (success) or 1 (failure)

結果セットResult Sets

なしNone

解説Remarks

テーブルで変更データキャプチャを有効にするには、その前にデータベースを有効にする必要があります。Before you can enable a table for change data capture, the database must be enabled. データベースで変更データキャプチャが有効になっているかどうかを確認するには、データベースカタログビューの is_cdc_enabled列に対してクエリを実行します。To determine whether the database is enabled for change data capture, query the is_cdc_enabled column in the sys.databases catalog view. データベースを有効にするには、 sp_cdc_enable_dbストアドプロシージャを使用します。To enable the database, use the sys.sp_cdc_enable_db stored procedure.

テーブルに対して変更データ キャプチャを有効にすると、変更テーブルと 1 つまたは 2 つのクエリ関数が生成されます。When change data capture is enabled for a table, a change table and one or two query functions are generated. 変更テーブルは、キャプチャ プロセスによってトランザクション ログから抽出されたソース テーブルの変更に関するリポジトリとして機能します。The change table serves as a repository for the source table changes extracted from the transaction log by the capture process. クエリ関数は、変更テーブルからデータを抽出するために使用されます。The query functions are used to extract data from the change table. これらの関数の名前は、次の方法でcapture_instanceパラメーターから派生します。The names of these functions are derived from the capture_instance parameter in the following ways:

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

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

また、ソーステーブルが変更データキャプチャを有効にするデータベース内の最初のテーブルであり、データベースにトランザクションパブリケーションが存在しない場合は、データベースのキャプチャジョブとクリーンアップジョブも作成されます sp_cdc_enable_table。sys.sp_cdc_enable_table also creates the capture and cleanup jobs for the database if the source table is the first table in the database to be enabled for change data capture and no transactional publications exist for the database. この例では、 is_tracked_by_cdc列を1に設定します。It sets the is_tracked_by_cdc column in the sys.tables catalog view to 1.

注意

テーブルで変更データ キャプチャが有効になっている場合、SQL ServerSQL Server エージェントが実行されている必要はありません。SQL ServerSQL Server Agent does not have to be running when change data capture is enabled for a table. ただし、エージェントが実行されていない場合、キャプチャプロセスではトランザクションログを処理し、変更テーブルにエントリを書き込むことはありません SQL ServerSQL ServerHowever, the capture process will not process the transaction log and write entries to the change table unless SQL ServerSQL Server Agent is running.

アクセス許可Permissions

Db_owner固定データベースロールのメンバーシップが必要です。Requires membership in the db_owner fixed database role.

Examples

A.A. 必須パラメーターのみを指定して変更データキャプチャを有効にするEnabling change data capture by specifying only required parameters

次の例では、テーブルに対して変更データキャプチャを有効にし HumanResources.Employee ます。The following example enables change data capture for the HumanResources.Employee table. 必須のパラメーターのみが指定されています。Only the required parameters are specified.

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

B:B. 追加の省略可能なパラメーターを指定して変更データキャプチャを有効にするEnabling change data capture by specifying additional optional parameters

次の例では、テーブルに対して変更データキャプチャを有効にし HumanResources.Department ます。The following example enables change data capture for the HumanResources.Department table. を除くすべてのパラメーターが指定されてい @allow_partition_switch ます。All parameters except @allow_partition_switch are specified.

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  

関連項目See Also

sp_cdc_disable_table (Transact-sql) sys.sp_cdc_disable_table (Transact-SQL)
sp_cdc_help_change_data_capture (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_all_changes_<capture_instance> (Transact-SQL)
cdc. fn_cdc_get_net_changes_<capture_instance> (Transact-sql) cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL)
sp_cdc_help_jobs (Transact-sql)sys.sp_cdc_help_jobs (Transact-SQL)