Compartir a través de


Habilitar la captura de datos modificados

Este tema se ocupa de cómo se puede habilitar la captura de datos modificados para una tabla y una base de datos.

Habilitar la captura de datos modificados en una base de datos

Para que pueda crearse una instancia de captura para tablas individuales, es preciso que un miembro de la función fija de servidor sysadmin habilite previamente la base de datos para la captura de datos modificados. Esto se hace ejecutando el procedimiento almacenado sys.sp_cdc_enable_db (Transact-SQL) en el contexto de la base de datos. Para determinar si una base de datos ya está habilitada, consulte la columna is_cdc_enabled en la vista de catálogo sys.databases.

Al habilitar una base de datos para la captura de datos modificados, se crean para la base de datos el esquema cdc, el usuario cdc, las tablas de metadatos y otros objetos de sistema. El esquema cdc contiene las tablas de metadatos de la captura de datos modificados y, una vez que las tablas de origen han sido habilitadas para esta captura, también contiene las tablas de cambios individuales que sirven como repositorio de los datos de cambios. Este esquema cdc también contiene las funciones de sistema asociadas que se usan para consultar los datos modificados.

La captura de datos modificados requiere el uso exclusivo del esquema cdc y del usuario cdc. Si en una base de datos existe un esquema o un usuario de base de datos denominado cdc, dicha base de datos no se puede habilitar para la captura de datos modificados hasta que el esquema y/o el usuario se quiten o se cambie su nombre.

Vea la plantilla Habilitar una base de datos para la captura de datos modificados si desea obtener un ejemplo de cómo habilitar una base de datos.

Nota importanteImportante

Para buscar las plantillas en SQL Server Management Studio, vaya a Ver, haga clic en Explorador de plantillas y, a continuación, seleccione Plantillas de SQL Server. Captura de datos modificados es una subcarpeta. Bajo esta carpeta, encontrará todas las plantillas a las que se hace referencia en este tema. También existe un icono Explorador de plantillas en la barra de herramientas de SQL Server Management Studio.

-- ================================

-- Plantilla Enable Database for CDC

-- ================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_db
GO

Habilitar la captura de datos modificados para una tabla

Una vez se haya habilitado una base de datos para la captura de datos modificados, los miembros de la función de base de datos fija db_owner pueden crear una instancia de captura para tablas de origen individuales mediante el procedimiento almacenado sys.sp_cdc_enable_table. Para determinar si una tabla de origen se ha habilitado ya para la captura de datos modificados, examine la columna is_tracked_by_cdc en la vista de catálogo sys.tables.

Se pueden especificar las opciones siguientes al crear una instancia de captura:

Columnas de la tabla de origen que se van a capturar.

De forma predeterminada, todas las columnas de la tabla de origen se identifican como columnas capturadas. Si sólo es necesario realizar el seguimiento de un subconjunto de las columnas, por ejemplo, por motivos de privacidad o de rendimiento, utilice el parámetro @captured_column_list para especificar el subconjunto de columnas.

Grupo de archivos que contendrá la tabla de cambios.

De forma predeterminada, la tabla de cambios se encuentra en el grupo de archivos predeterminado de la base de datos. Los propietarios de base de datos que deseen controlar la ubicación de las tablas de cambios individuales pueden utilizar el parámetro @filegroup_name para especificar un grupo de archivos determinado para la tabla de cambios asociada a la instancia de captura. El grupo de archivos con nombre debe existir previamente. Generalmente, se recomienda que las tablas de cambios se coloquen en un grupo de archivos independiente de las tablas de origen. Vea la plantilla Enable a Table Specifying Filegroup Option para obtener un ejemplo de cómo utilizar el parámetro @filegroup_name.

===================================================

-- Plantilla Enable a Table Specifying Filegroup Option

-- ===================================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MyTable',
@role_name     = N'MyRole',
@filegroup_name = N'MyDB_CT',
@supports_net_changes = 1
GO

Una función para controlar el acceso a una tabla de cambios.

La finalidad de la función con nombre es controlar el acceso a los datos de cambios. La función especificada puede ser una función fija de servidor existente o una función de la base de datos. Si la función especificada aún no existe, se crea automáticamente una función de la base de datos con ese nombre. Los miembros de la función sysadmin o db_owner tienen acceso total a los datos de las tablas de cambios. Los demás usuarios deben tener el permiso SELECT en todas las columnas capturadas de la tabla de origen. Además, cuando se especifica una función, los usuarios que no sean miembros de la función sysadmin o db_owner también deben ser miembros de la función especificada.

Si no desea utilizar una función de acceso, debe establecer explícitamente el valor NULL en el parámetro @role_name. Vea la plantilla Enable a Table Without Using a Gating Role para obtener un ejemplo de cómo habilitar una tabla sin una función de acceso.

-- ===================================================

-- Plantilla Enable a Table Without Using a Gating Role

-- ===================================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MyTable>',
@role_name     = NULL,
@supports_net_changes = 1
GO

Una función para realizar consultas de cambios netos.

Una instancia de captura siempre incluirá una función con valores de tabla para devolver todas las entradas de la tabla de cambios que se produjeron dentro de un intervalo definido. Esta función se denomina anexando el nombre de la instancia de captura a "cdc.fn_cdc_get_all_changes_". Para obtener más información, vea cdc.fn_cdc_get_all_changes_<capture_instance> (Transact-SQL).

Si el parámetro @supports_net_changes está establecido en 1, también se genera una función net changes para la instancia de captura. Esta función devuelve sólo un cambio por cada fila distinta que haya cambiado en el intervalo especificado en la llamada. Para obtener más información, vea cdc.fn_cdc_get_net_changes_<capture_instance> (Transact-SQL).

Para poder usar las consultas net changes, la tabla de origen debe tener una clave principal o un índice único que identifique las filas de forma única. Si se utiliza un índice único, el nombre del índice se debe especificar con el parámetro @index_name. Las columnas definidas en la clave principal o índice único deben estar incluidas en la lista de columnas de origen que se van a capturar.

Vea la plantilla Enable a Table for All and Net Changes Queries para obtener un ejemplo que muestre la creación de una instancia de captura con ambas funciones de consulta.

=======================================================

-- Plantilla Enable a Table for All and Net Changes Queries

-- =======================================================

USE MyDB
GO

EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name   = N'MyTable',
@role_name     = N'MyRole',
@supports_net_changes = 1
GO

Nota

Si la captura de datos modificados está habilitada en una tabla con una clave principal existente y el parámetro @index_name no se utiliza para identificar un índice único alternativo, la característica de captura de datos modificados utilizará la clave principal. Los cambios subsiguientes en la clave principal no se permitirán sin deshabilitar primero la captura de datos modificados para la tabla. Esto es así independientemente de si se solicitó compatibilidad con las consultas net changes cuando se configuró la captura de datos modificados. Si no hay ninguna clave principal en una tabla en el momento en que se habilita para la captura de datos modificados, la captura de datos modificados omite la incorporación posterior de una clave principal. Dado que la captura de datos modificados no utilizará ninguna clave principal que se cree una vez habilitada la tabla, las columnas de clave y la clave se pueden quitar sin restricciones.