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

SE APLICA A: síSQL Server (a partir de 2008) noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

Habilita la captura de datos modificados para la tabla de origen especificada en la base de datos actual.Enables change data capture for the specified source table in the current database. Cuando una tabla está habilitada para la captura de datos modificados, un registro de cada operación del lenguaje de manipulación de datos (DML) aplicada a la tabla se escribe en el registro de transacciones.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. El proceso de captura de datos de cambio recupera esta información del registro y la escribe para cambiar las tablas a las que se accede mediante un conjunto de funciones.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 captura de datos modificados no está disponible en todas las ediciones de MicrosoftMicrosoftSQL ServerSQL Server.Change data capture is not available in every edition of MicrosoftMicrosoftSQL ServerSQL Server. Para obtener una lista de las características admitidas por las ediciones de SQL ServerSQL Server, vea Características compatibles con las ediciones 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.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

[ @source_schema = ] 'source_schema' Es el nombre del esquema en la que pertenece la tabla de origen.[ @source_schema = ] 'source_schema' Is the name of the schema in which the source table belongs. source_schema es sysname, no tiene ningún valor predeterminado, y no puede ser NULL.source_schema is sysname, with no default, and cannot be NULL.

[ @source_name = ] 'source_name' Es el nombre de la tabla de origen en el que se va a habilitar la captura de datos modificados.[ @source_name = ] 'source_name' Is the name of the source table on which to enable change data capture. source_name es sysname, no tiene ningún valor predeterminado, y no puede ser NULL.source_name is sysname, with no default, and cannot be NULL.

source_name debe existir en la base de datos actual.source_name must exist in the current database. Las tablas de la cdc esquema no se puede habilitar para la captura de datos modificados.Tables in the cdc schema cannot be enabled for change data capture.

[ @role_name = ] 'role_name' Es el nombre del rol de base de datos usada para obtener acceso a datos modificados.[ @role_name = ] 'role_name' Is the name of the database role used to gate access to change data. role_name es sysname y deben especificarse.role_name is sysname and must be specified. Si se establece explícitamente en NULL, no se utiliza ningún rol de acceso para limitar el acceso a los datos modificados.If explicitly set to NULL, no gating role is used to limit access to the change data.

Se utiliza el rol si ya existe.If the role currently exists, it is used. Si el rol no existe, se intenta crear un rol de base de datos con el nombre especificado.If the role does not exist, an attempt is made to create a database role with the specified name. Antes de intentar crear el rol, se recortan los espacios en blanco a la derecha de la cadena del nombre del rol.The role name is trimmed of white space at the right of the string before attempting to create the role. Si el autor de la llamada no está autorizado a crear un rol dentro de la base de datos, se producirá un error en la operación del procedimiento almacenado.If the caller is not authorized to create a role within the database, the stored procedure operation fails.

[ @capture_instance = ] 'capture_instance' Es el nombre de la instancia de captura que usa para datos modificados específicos de una instancia de nombres de objetos de captura.[ @capture_instance = ] 'capture_instance' Is the name of the capture instance used to name instance-specific change data capture objects. capture_instance es sysname y no puede ser NULL.capture_instance is sysname and cannot be NULL.

Si no se especifica, el nombre se deriva del nombre de esquema de origen más el nombre de la tabla de origen en el formato 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 no puede superar los 100 caracteres y debe ser único dentro de la base de datos.capture_instance cannot exceed 100 characters and must be unique within the database. Especificado o derivado, capture_instance se recortan los espacios en blanco a la derecha de la cadena.Whether specified or derived, capture_instance is trimmed of any white space to the right of the string.

Una tabla de origen puede tener un máximo de dos instancias de captura.A source table can have a maximum of two capture instances. Para obtener más información, vea 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 Indica si la compatibilidad con consultas de cambios netos es que esté habilitado para esta instancia de captura.[ @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 es bit con el valor predeterminado es 1 si la tabla tiene una clave principal o la tabla tiene un índice único identificado mediante el uso de la @index_name parámetro.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. De lo contrario, el parámetro tiene como valor predeterminado 0.Otherwise, the parameter defaults to 0.

Si es 0, solo se generan las funciones de compatibilidad para consultar todos los cambios.If 0, only the support functions to query for all changes are generated.

Si es 1, se generan también las funciones necesarias para consultar los cambios de la red.If 1, the functions that are needed to query for net changes are also generated.

Si supports_net_changes está establecido en 1, index_name debe especificarse, o la tabla de origen debe tener definida una clave principal.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_' El nombre de un índice único se utiliza para identificar de forma única las filas de la tabla de origen.[ @index_name = ] 'index_name_' The name of a unique index to use to uniquely identify rows in the source table. index_name es sysname y puede ser NULL.index_name is sysname and can be NULL. Si se especifica, index_name debe ser un índice único válido en la tabla de origen.If specified, index_name must be a valid unique index on the source table. Si index_name se especifica, las columnas de índice identificadas tiene prioridad sobre las columnas de clave principales definidas como el identificador de fila único para la tabla.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' Identifica las columnas de tabla de origen que deben incluirse en la tabla de cambios.[ @captured_column_list = ] 'captured_column_list' Identifies the source table columns that are to be included in the change table. captured_column_list es nvarchar (max) y puede ser NULL.captured_column_list is nvarchar(max) and can be NULL. Si es NULL, se incluyen todas las columnas en la tabla de cambios.If NULL, all columns are included in the change table.

Los nombres de columna deben ser columnas válidas de la tabla de origen.Column names must be valid columns in the source table. Las columnas definidas en un índice de clave principal o las columnas definidas en un índice al que hace referencia index_name debe incluirse.Columns defined in a primary key index, or columns defined in an index referenced by index_name must be included.

captured_column_list es una lista separada por comas de nombres de columna.captured_column_list is a comma-separated list of column names. Los nombres de las columnas individuales que figuran en la lista se pueden incluir opcionalmente entre comillas dobles ("") o corchetes ([]).Individual column names within the list can be optionally quoted by using either double quotation marks ("") or square brackets ([]). Si un nombre de columna contiene una coma, se debe entrecomillar el nombre de columna.If a column name contains an embedded comma, the column name must be quoted.

captured_column_list no puede contener los siguientes nombres de columna reservados: __ $start_lsn, __ $end_lsn, __ $seqval, __ $ operación, y __ $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' Es el grupo de archivos que se usará para la tabla de cambio creada para la instancia de captura.[ @filegroup_name = ] 'filegroup_name' Is the filegroup to be used for the change table created for the capture instance. filegroup_name es sysname y puede ser NULL.filegroup_name is sysname and can be NULL. Si se especifica, filegroup_name debe definirse para la base de datos actual.If specified, filegroup_name must be defined for the current database. Si es NULL, se usa el grupo de archivos predeterminado.If NULL, the default filegroup is used.

Se recomienda crear un grupo de archivos independiente para las tablas de cambios de la captura de datos modificados.We recommend creating a separate filegroup for change data capture change tables.

[ @allow_partition_switch = ] 'allow_partition_switch' Indica si se puede ejecutar el comando SWITCH PARTITION de ALTER TABLE en una tabla que está habilitada para la captura de datos modificados.[ @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 es bit, su valor predeterminado es 1.allow_partition_switch is bit, with a default of 1.

Para las tablas sin particiones, el valor del modificador es siempre 1 y se omite el valor real.For nonpartitioned tables, the switch setting is always 1, and the actual setting is ignored. Si el modificador está establecido explícitamente en 0 para una tabla sin particiones, se genera la advertencia 22857 para indicar que se ha omitido el valor del modificador.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 el modificador está establecido explícitamente en 0 para una tabla con particiones, se genera la advertencia 22356 para indicar que se denegarán las operaciones de modificador de partición en la tabla de origen.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. Por último, si el valor del modificador está establecido explícitamente en 1 o permite tener como valor predeterminado 1 y la tabla habilitada tiene particiones, se genera la advertencia 22855 para indicar que los modificadores de partición no se bloquearán.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 se realiza alguna operación de modificador de partición, la captura de datos modificados no realizará el seguimiento de los cambios resultantes de dicha operación.If any partition switches occur, change data capture will not track the changes resulting from the switch. Esto producirá incoherencia en los datos cuando se utilicen los datos modificados.This will cause data inconsistencies when the change data is consumed.

Importante

SWITCH PARTITION es una operación de metadatos, pero produce cambios en los datos.SWITCH PARTITION is a metadata operation, but it causes data changes. Los cambios en los datos asociados a esta operación no se capturan en las tablas de cambios de capturas de datos modificados.The data changes that are associated with this operation are not captured in the change data capture change tables. Considere una tabla que tiene tres particiones. Se realizan cambios en esta tabla.Consider a table that has three partitions, and changes are made to this table. El proceso de captura realizará el seguimiento de las operaciones de inserción, actualización y eliminación del usuario que se ejecutan en la tabla.The capture process will track user insert, update, and delete operations that are executed against the table. Sin embargo, si se desactiva una partición en otra tabla (por ejemplo, para realizar una eliminación masiva), las filas movidas como parte de esta operación no se capturarán como filas eliminadas en la tabla de cambios.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 igual forma, si una partición nueva que tiene las filas rellenas de antemano se agrega a la tabla, estas filas no se reflejarán en la tabla de cambios.Similarly, if a new partition that has prepopulated rows is added to the table, these rows will not be reflected in the change table. Esto puede producir incoherencias en los datos cuando una aplicación utilice los cambios y los aplique en el destino.This can cause data inconsistency when the changes are consumed by an application and applied to a destination.

Valores de código de retornoReturn Code Values

0 (correcto) o 1 (error)0 (success) or 1 (failure)

Conjuntos de resultadosResult Sets

NoneNone

ComentariosRemarks

Para poder habilitar una tabla para la captura de datos modificados, la base de datos debe estar habilitada.Before you can enable a table for change data capture, the database must be enabled. Para determinar si la base de datos está habilitada para la captura de datos modificados, consulte el is_cdc_enabled columna en el sys.databases vista de catálogo.To determine whether the database is enabled for change data capture, query the is_cdc_enabled column in the sys.databases catalog view. Para habilitar la base de datos, use el sys.sp_cdc_enable_db procedimiento almacenado.To enable the database, use the sys.sp_cdc_enable_db stored procedure.

Cuando la captura de datos modificados está habilitada para una tabla, se generan una tabla de cambios y una o dos funciones de consulta.When change data capture is enabled for a table, a change table and one or two query functions are generated. La tabla de cambios actúa de repositorio para los cambios de la tabla de origen extraídos del registro de transacciones por el proceso de captura.The change table serves as a repository for the source table changes extracted from the transaction log by the capture process. Las funciones de consulta se utilizan para extraer los datos de la tabla de cambios.The query functions are used to extract data from the change table. Los nombres de estas funciones se derivan los capture_instance parámetro de las maneras siguientes:The names of these functions are derived from the capture_instance parameter in the following ways:

  • Función de todos los cambios: cdc.fn_cdc_get_all_changes_ < capture_instance >All changes function: cdc.fn_cdc_get_all_changes_<capture_instance>

  • Función de los cambios de red: cdc.fn_cdc_get_net_changes_ < capture_instance >Net changes function: cdc.fn_cdc_get_net_changes_<capture_instance>

Sys.sp_cdc_enable_table también crea los trabajos de captura y limpieza de la base de datos si la tabla de origen es la primera tabla de la base de datos esté habilitado para la captura de datos modificados y no existe ninguna publicación transaccional para la base de datos.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. Establece el is_tracked_by_cdc columna en el sys.tables en 1 la vista de catálogo.It sets the is_tracked_by_cdc column in the sys.tables catalog view to 1.

Nota

No es necesario que el Agente SQL ServerSQL Server se esté ejecutando cuando se habilita la captura de datos modificados para una tabla.SQL ServerSQL Server Agent does not have to be running when change data capture is enabled for a table. Sin embargo, el proceso de captura no procesará las entradas de escritura y del registro de transacciones en la tabla de cambios a menos que se ejecute el Agente SQL ServerSQL Server.However, the capture process will not process the transaction log and write entries to the change table unless SQL ServerSQL Server Agent is running.

PermisosPermissions

Debe pertenecer a la db_owner rol fijo de base de datos.Requires membership in the db_owner fixed database role.

EjemplosExamples

A.A. Habilitar la captura de datos de cambio especificando solo los parámetros necesariosEnabling change data capture by specifying only required parameters

En el siguiente ejemplo se habilita la captura de datos modificados para la tabla HumanResources.Employee.The following example enables change data capture for the HumanResources.Employee table. Solo se especifican los parámetros necesarios.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. Habilitar la captura de datos de cambio especificando parámetros opcionales adicionalesEnabling change data capture by specifying additional optional parameters

En el siguiente ejemplo se habilita la captura de datos modificados para la tabla HumanResources.Department.The following example enables change data capture for the HumanResources.Department table. Se especifican todos los parámetros excepto @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  

Vea tambiénSee 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)