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

S’APPLIQUE À : ouiSQL Server nonAzure SQL Database nonAzure SQL Data Warehouse nonParallel Data Warehouse APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Active la capture de données modifiées pour la table source spécifiée dans la base de données actuelle.Enables change data capture for the specified source table in the current database. Lorsqu'une table est activée pour la capture de données modifiées, un enregistrement de chaque opération DML (Data Manipulation Language) appliquée à la table est écrit dans le journal des transactions.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. Le processus de capture de données modifiées extrait ces informations du journal et les écrit dans les tables de modifications accédées à l'aide d'un ensemble de fonctions.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.

La capture des modifications de données n’est pas disponible dans toutes les éditions de MicrosoftMicrosoftSQL ServerSQL Server.Change data capture is not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Pour obtenir la liste des fonctionnalités prises en charge par les éditions de SQL ServerSQL Server, consultez Fonctionnalités prise en charge par les éditions de 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.

Icône de lien de rubrique Conventions de la syntaxe Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SyntaxeSyntax

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

ArgumentsArguments

[ @source_schema = ] 'source_schema' Est le nom du schéma auquel appartient la table source.[ @source_schema = ] 'source_schema' Is the name of the schema in which the source table belongs. source_schema est sysname, sans valeur par défaut, et ne peut pas être NULL.source_schema is sysname, with no default, and cannot be NULL.

[ @source_name = ] 'source_name' Est le nom de la table source sur laquelle activer de capture de données modifiées.[ @source_name = ] 'source_name' Is the name of the source table on which to enable change data capture. source_name est sysname, sans valeur par défaut, et ne peut pas être NULL.source_name is sysname, with no default, and cannot be NULL.

source_name doit exister dans la base de données actuelle.source_name must exist in the current database. Tables dans le cdc schéma ne peut pas être activé pour la capture de données modifiées.Tables in the cdc schema cannot be enabled for change data capture.

[ @role_name = ] 'role_name' Est le nom du rôle de base de données utilisé pour réguler l’accès aux données modifiées.[ @role_name = ] 'role_name' Is the name of the database role used to gate access to change data. nom_rôle est sysname et doit être spécifié.role_name is sysname and must be specified. En cas de définition explicitement sur NULL, aucun rôle de régulation n'est utilisé pour limiter l'accès aux données de modifications.If explicitly set to NULL, no gating role is used to limit access to the change data.

Si le rôle existe actuellement, il est utilisé.If the role currently exists, it is used. Si le rôle n'existe pas, une tentative est faite pour créer un rôle de base de données avec le nom spécifié.If the role does not exist, an attempt is made to create a database role with the specified name. L'espace blanc est retiré à la droite de la chaîne dans le nom de rôle avant d'essayer de créer le rôle.The role name is trimmed of white space at the right of the string before attempting to create the role. Si l'appelant n'est pas autorisé à créer un rôle dans la base de données, la procédure stockée échoue.If the caller is not authorized to create a role within the database, the stored procedure operation fails.

[ @capture_instance = ] 'capture_instance' Est que le nom de l’instance de capture utilisée pour nommer modifiées spécifiques à l’instance de données objets de capture.[ @capture_instance = ] 'capture_instance' Is the name of the capture instance used to name instance-specific change data capture objects. capture_instance est sysname et ne peut pas être NULL.capture_instance is sysname and cannot be NULL.

Si non spécifié, le nom est dérivé du nom de schéma ainsi que le nom de la table source au format 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 ne peut pas dépasser 100 caractères et doit être unique au sein de la base de données.capture_instance cannot exceed 100 characters and must be unique within the database. Si spécifié ou dérivé, capture_instance n’importe quel espace blanc à droite de la chaîne est retiré.Whether specified or derived, capture_instance is trimmed of any white space to the right of the string.

Une table source peut avoir un maximum de deux instances de capture.A source table can have a maximum of two capture instances. Pour plus d’informations, consultez sys.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 Indique si la prise en charge de l’interrogation des modifications nettes doit être activé pour cette instance de capture.[ @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 est bits avec une valeur par défaut 1 si la table possède une clé primaire ou la table possède un index unique identifié à l’aide de le @index_name paramètre.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. Sinon, le paramètre a comme valeur par défaut 0.Otherwise, the parameter defaults to 0.

S'il a la valeur 0, seules les fonctions de prise en charge d'interrogation de toutes les modifications sont générées.If 0, only the support functions to query for all changes are generated.

S'il a la valeur 1, les fonctions nécessaires pour interroger les modifications nettes sont générées également.If 1, the functions that are needed to query for net changes are also generated.

Si supports_net_changes est défini sur 1, index_name doit être spécifié, ou la table source doit avoir une clé primaire définie.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_' Le nom d’un index unique à utiliser pour identifier de manière unique les lignes dans la table source.[ @index_name = ] 'index_name_' The name of a unique index to use to uniquely identify rows in the source table. index_name est sysname et peut être NULL.index_name is sysname and can be NULL. Si spécifié, index_name doit être un index unique valid sur la table source.If specified, index_name must be a valid unique index on the source table. Si index_name est spécifié, les colonnes d’index identifiées prévaut sur toute colonne de clé primaire définie comme identificateur de ligne unique pour la table.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' Identifie les colonnes de table source qui doivent être incluses dans la table de modifications.[ @captured_column_list = ] 'captured_column_list' Identifies the source table columns that are to be included in the change table. captured_column_list est nvarchar (max) et peut être NULL.captured_column_list is nvarchar(max) and can be NULL. Si la valeur est NULL, toutes les colonnes sont incluses dans la table de modifications.If NULL, all columns are included in the change table.

Les noms de colonnes doivent être des colonnes valides dans la table source.Column names must be valid columns in the source table. Colonnes définies dans un index de clé primaire, ou les colonnes définies dans un index référencé par index_name doit être inclus.Columns defined in a primary key index, or columns defined in an index referenced by index_name must be included.

captured_column_list est une liste séparée par des virgules de noms de colonnes.captured_column_list is a comma-separated list of column names. Des noms de colonnes individuels dans la liste peuvent être cités en utilisant des guillemets doubles ("") ou des crochets ([]).Individual column names within the list can be optionally quoted by using either double quotation marks ("") or square brackets ([]). Si un nom de colonne contient une virgule incorporée, il doit être entouré de guillemets.If a column name contains an embedded comma, the column name must be quoted.

captured_column_list ne peut pas contenir les noms de colonnes réservés suivants : __ $start_lsn, __ $end_lsn, __ $seqval, __ $ opération, et __ $update_mask.captured_column_list cannot contain the following reserved column names: __$start_lsn, __$end_lsn, __$seqval, __$operation, and __$update_mask.

[ @filegroup_name = ] 'filegroup_name' Est le groupe de fichiers à utiliser pour la table de modifications créée pour l’instance de capture.[ @filegroup_name = ] 'filegroup_name' Is the filegroup to be used for the change table created for the capture instance. FILEGROUP_NAME est sysname et peut être NULL.filegroup_name is sysname and can be NULL. Si spécifié, filegroup_name doit être définie pour la base de données actuelle.If specified, filegroup_name must be defined for the current database. Si la valeur est NULL, le groupe de fichiers par défaut est utilisé.If NULL, the default filegroup is used.

Nous recommandons de créer un groupe de fichiers séparé pour les tables de modifications de capture des données modifiées.We recommend creating a separate filegroup for change data capture change tables.

[ @allow_partition_switch = ] 'allow_partition_switch' Indique si la commande SWITCH PARTITION d’ALTER TABLE peut être exécutée sur une table prenant en charge pour la capture de données modifiées.[ @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 est bits, avec 1 comme valeur par défaut.allow_partition_switch is bit, with a default of 1.

Pour les tables non partitionnées, le paramètre de commutation est toujours 1 et le paramètre réel est ignoré.For nonpartitioned tables, the switch setting is always 1, and the actual setting is ignored. Si la commutation est définie explicitement sur 0 pour une table non partitionnée, un avertissement 22857 est émis pour indiquer que le paramètre de commutation a été ignoré.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. Si la commutation est définie explicitement sur 0 pour une table partitionnée, un avertissement 22356 est émis pour indiquer que les opérations de commutation de partition sur la table source seront rejetées.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. Pour finir, si le paramètre de commutation est défini explicitement sur 1 ou autorisé à avoir comme valeur par défaut 1 et que la table active est partitionnée, un avertissement 22855 est émis pour indiquer que les commutations de partition ne seront pas bloquées.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. Si une commutation de partition se produit, la capture de données modifiées n'effectue pas le suivi des modifications qui résultent de la commutation.If any partition switches occur, change data capture will not track the changes resulting from the switch. Cela provoquera des incohérences de données lors de la consommation des données de modifications.This will cause data inconsistencies when the change data is consumed.

Important

SWITCH PARTITION est une opération de métadonnées, mais elle entraîne des modifications de données.SWITCH PARTITION is a metadata operation, but it causes data changes. Les modifications de données associées à cette opération ne sont pas capturées dans les tables de modifications de capture de données modifiées.The data changes that are associated with this operation are not captured in the change data capture change tables. Pensez à une table qui comprend trois partitions et à laquelle des modifications sont apportées.Consider a table that has three partitions, and changes are made to this table. Le processus de capture effectuera le suivi des insertions, mises à jour et suppressions exécutées par l'utilisateur sur cette table.The capture process will track user insert, update, and delete operations that are executed against the table. Toutefois, si une partition est extraite dans une autre table (par exemple, pour effectuer une suppression en bloc), les lignes déplacées dans le cadre de cette opération ne seront pas capturées en tant que lignes supprimées dans la table de modifications.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. De la même façon, si une nouvelle partition qui comprend des lignes préremplies est ajoutée à la table, ces lignes ne se seront pas répercutées dans la table de modifications.Similarly, if a new partition that has prepopulated rows is added to the table, these rows will not be reflected in the change table. Cette situation peut aboutir à des données incohérentes lorsque les modifications sont utilisées par une application et appliquées à une destination.This can cause data inconsistency when the changes are consumed by an application and applied to a destination.

Valeurs des codes de retourReturn Code Values

0 (réussite) ou 1 (échec)0 (success) or 1 (failure)

Jeux de résultatsResult Sets

AucunNone

NotesRemarks

Pour pouvoir activer une table pour la capture de données modifiées, la base de données doit être activée.Before you can enable a table for change data capture, the database must be enabled. Pour déterminer si la base de données est activée pour la capture de données modifiées, interrogez la is_cdc_enabled colonne dans le sys.databases vue de catalogue.To determine whether the database is enabled for change data capture, query the is_cdc_enabled column in the sys.databases catalog view. Pour activer la base de données, utilisez le sys.sp_cdc_enable_db procédure stockée.To enable the database, use the sys.sp_cdc_enable_db stored procedure.

Lorsque la capture de données modifiées est activée pour une table, une table de modifications et une ou deux fonctions de requêtes sont générées.When change data capture is enabled for a table, a change table and one or two query functions are generated. La table de modifications sert de base de données de référentiel pour les modifications de table source extraites du journal des transactions par le processus de capture.The change table serves as a repository for the source table changes extracted from the transaction log by the capture process. Les fonctions de requête sont utilisées pour extraire des données de la table de modifications.The query functions are used to extract data from the change table. Les noms de ces fonctions sont dérivés de la capture_instance paramètre comme suit :The names of these functions are derived from the capture_instance parameter in the following ways:

  • Fonction de toutes les modifications : cdc.fn_cdc_get_all_changes_ < capture_instance >All changes function: cdc.fn_cdc_get_all_changes_<capture_instance>

  • Fonction de modifications nettes : cdc.fn_cdc_get_net_changes_ < capture_instance >Net changes function: cdc.fn_cdc_get_net_changes_<capture_instance>

Sys.sp_cdc_enable_table crée également les tâches de capture et de nettoyage pour la base de données si la table source est la première table dans la base de données doit être activé pour la capture de données modifiées et aucune publication transactionnelle n’existe pour la base de données.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. Il définit le is_tracked_by_cdc colonne dans le sys.tables affichage 1 catalogue.It sets the is_tracked_by_cdc column in the sys.tables catalog view to 1.

Notes

Il n'est pas nécessaire que l'agent SQL ServerSQL Server soit en cours d'exécution lorsque la capture de données modifiées est activée pour une table.SQL ServerSQL Server Agent does not have to be running when change data capture is enabled for a table. Toutefois, le processus de capture ne traitera pas le journal des transactions et n'écrira pas d'entrées dans la table de modifications si l'Agent SQL ServerSQL Server ne s'exécute pas.However, the capture process will not process the transaction log and write entries to the change table unless SQL ServerSQL Server Agent is running.

AutorisationsPermissions

Nécessite l’appartenance dans le db_owner rôle de base de données fixe.Requires membership in the db_owner fixed database role.

ExemplesExamples

R.A. Activation de la capture des données modifiées en spécifiant uniquement les paramètres requisEnabling change data capture by specifying only required parameters

L'exemple suivant active la capture des données modifiées pour la table HumanResources.Employee.The following example enables change data capture for the HumanResources.Employee table. Seuls les paramètres requis sont spécifiés.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. Activation de la capture de données modifiées en spécifiant des paramètres facultatifs supplémentairesEnabling change data capture by specifying additional optional parameters

L'exemple suivant active la capture des données modifiées pour la table HumanResources.Department.The following example enables change data capture for the HumanResources.Department table. Tous les paramètres sauf @allow_partition_switch sont spécifiés.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  

Voir aussiSee Also

sys.sp_cdc_disable_table (Transact-SQL) sys.sp_cdc_disable_table (Transact-SQL)
sys.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)
sys.sp_cdc_help_jobs (Transact-SQL)sys.sp_cdc_help_jobs (Transact-SQL)