sys.sp_cdc_enable_table (Transact-SQL)

Habilita la captura de datos modificados para la tabla de origen especificada en la base de datos actual. 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. El proceso de captura de datos modificados recupera esta información del registro y la escribe para cambiar las tablas a la que se accede mediante un conjunto de funciones.

La captura de datos modificados sólo está disponible en las ediciones Enterprise, Developer y Evaluation de SQL Server 2008.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • [ @source_schema = ] 'source_schema'
    Es el nombre del esquema al que pertenece la tabla de origen. source_schema es de tipo sysname, sin valor predeterminado, y no puede ser NULL.

  • [ @source_name = ] 'source_name'
    Es el nombre de la tabla de origen en la que habilitar la captura de datos modificados. source_name es de tipo sysname, sin valor predeterminado, y no puede ser NULL.

    source_name debe existir en la base de datos actual. Las tablas en el esquema cdc no pueden habilitarse para la captura de datos modificados.

  • [ @role_name = ] 'role_name'
    Es el nombre de la función de base de datos que se usa para tener acceso a los datos modificados. role_name es de tipo sysname y debe tener un valor especificado. Si se establece explícitamente en NULL, no se utiliza ninguna función de acceso para limitar el acceso a los datos modificados.

    Se utiliza la función si ya existe. Si la función no existe, se intenta crear una función de la base de datos con el nombre especificado. Antes de intentar crear la función, se recortan los espacios en blanco a la derecha de la cadena del nombre de la función. Si el autor de la llamada no está autorizado a crear una función dentro de la base de datos, se producirá un error en la operación del procedimiento almacenado.

  • [ @capture_instance = ] 'capture_instance'
    Es el nombre de la instancia de captura que se usa para denominar los objetos de captura de datos modificados específicos de una instancia. capture_instance es de tipo sysname y no puede ser NULL.

    Si no se especifica, el nombre deriva del nombre del esquema de origen más el nombre de la tabla origen, con el formato schemaname_sourcename. capture_instance no puede superar los 100 caracteres y debe ser único en la base de datos. En cualquiera de los dos casos (especificado o derivado), se recortan los espacios en blanco a la derecha de la cadena de capture_instance.

    Una tabla de origen puede tener un máximo de dos instancias de captura. Para obtener más información, consulte sys.sp_cdc_help_change_data_capture (Transact-SQL).

  • [ @supports_net_changes = ] supports_net_changes
    Indica si la compatibilidad con la consulta de cambios de red se va a habilitar para esta instancia de captura. supports_net_changes es bit con un valor predeterminado de 1 si la tabla tiene una clave principal o un índice único identificado mediante el parámetro @index\_name. De lo contrario, el parámetro tiene como valor predeterminado 0.

    Si es 0, sólo se generan las funciones de compatibilidad para consultar todos los cambios.

    Si es 1, se generan también las funciones necesarias para consultar los cambios de la red.

    Si supports_net_changes se establecido en 1, se debe especificar index_name o la tabla de origen debe tener una clave principal definida.

  • [ @index_name = ] **'**index_name'
    Es el nombre de un índice único que se va a usar para identificar de manera única las filas de la tabla de origen. index_name es de tipo sysname y puede ser NULL. Si se especifica, index_name debe ser un índice único válido en la tabla de origen. Si se especifica index_name, las columnas de índice identificadas tienen prioridad sobre cualquier columna de clave principal definida como el identificador de fila único para la tabla.

  • [ @captured_column_list = ] 'captured_column_list'
    Identifica las columnas de la tabla de origen que se incluirán en la tabla de cambios. captured_column_list es de tipo nvarchar(max) y puede ser NULL. Si es NULL, se incluyen todas las columnas en la tabla de cambios.

    Los nombres de columna deben ser columnas válidas de la tabla de origen. Deben incluirse las columnas definidas en un índice de clave principal o las columnas definidas en un índice al que index_name haga referencia.

    captured_column_list es una lista delimitada por comas de nombres de columna. Los nombres de las columnas individuales que figuran en la lista se pueden incluir opcionalmente entre comillas dobles ("") o corchetes ([]). Si un nombre de columna contiene una coma, se debe entrecomillar el nombre de columna.

    captured_column_list no puede contener los siguientes nombres de columna reservados: __$start_lsn, __$end_lsn, __$seqval, __$operation y __$update_mask.

  • [ @filegroup_name = ] 'filegroup_name'
    Es el grupo de archivos que se va a usar en la tabla de cambios creada para la instancia de captura. filegroup_name es de tipo sysname y puede ser NULL. Si se especifica, filegroup_name debe estar definido para la base de datos actual. Si es NULL, se usa el grupo de archivos predeterminado.

    Se recomienda crear un grupo de archivos independiente para las tablas de cambios de la captura de datos modificados. Para obtener más información, consulte Configuración del mecanismo de captura de datos modificados.

  • [ @allow_partition_switch= ] 'allow_partition_switch'
    Indica si el comando SWITCH PARTITION de ALTER TABLE se puede ejecutar en una tabla que esté habilitada para la captura de datos modificados. allow_partition_switch es bit y su valor predeterminado es 1.

    Para las tablas sin particiones, el valor del modificador es siempre 1 y se omite el valor real. 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. 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. 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. 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. Esto producirá incoherencia en los datos cuando se utilicen los datos modificados.

    Nota importanteImportante

    SWITCH PARTITION es una operación de metadatos, pero produce cambios en los datos. Los cambios en los datos asociados a esta operación no se capturan en las tablas de cambios de capturas de datos modificados. Considere una tabla que tiene tres particiones. Se realizan cambios en esta tabla. 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. 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. 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. Esto puede producir incoherencias en los datos cuando una aplicación utilice los cambios y los aplique en el destino.

Valores de código de retorno

0 (correcto) o 1 (error)

Conjuntos de resultados

Ninguno

Notas

Para poder habilitar una tabla para la captura de datos modificados, la base de datos debe estar habilitada. Para determinar si una base de datos está ya habilitada para la captura de datos modificados, consulte la columna is_cdc_enabled en la vista de catálogo sys.databases. Para habilitar la base de datos, use el procedimiento almacenado sys.sp_cdc_enable_db.

Cuando la captura de datos modificados está habilitada para una tabla, se generan una tabla de cambios y una o dos funciones de consulta. 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. Las funciones de consulta se utilizan para extraer los datos de la tabla de cambios. Los nombres de estas funciones se derivan del parámetro capture_instance de la manera siguiente:

  • Función para todos los cambios: cdc.fn_cdc_get_all_changes_<instancia_de_captura>

  • Función para los cambios de red: cdc.fn_cdc_get_net_changes_<instancia_de_captura>

sys.sp_cdc_enable_table crea también los trabajos de limpieza y de captura de la base de datos si la tabla de origen es la primera tabla de la base de datos que se va a habilitar para la captura de datos modificados y no existe ninguna publicación transaccional para la base de datos. Establece la columna is_tracked_by_cdc en la vista de catálogo sys.tables en 1.

[!NOTA]

No es necesario que el Agente SQL Server se esté ejecutando cuando se habilita la captura de datos modificados para una tabla. 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 Server.

Permisos

Debe pertenecer a la función fija de base de datos db_owner.

Ejemplos

A. Habilitar la captura de datos modificados especificando solo los parámetros necesarios

En el siguiente ejemplo se habilita la captura de datos modificados para la tabla HumanResources.Employee. Solo se especifican los parámetros necesarios.

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

B. Habilitar la captura de datos modificados especificando parámetros opcionales adicionales

En el siguiente ejemplo se habilita la captura de datos modificados para la tabla HumanResources.Department. Se especifican todos los parámetros excepto @allow\_partition\_switch.

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