Configuración y administración del seguimiento de cambios

En este tema se describe cómo habilitar, deshabilitar y administrar el seguimiento de cambios. También se describe cómo configurar la seguridad, así como determinar los efectos en el almacenamiento y en el rendimiento cuando se utiliza esta característica.

Habilitación del seguimiento de cambios para una base de datos

Para poder utilizarlo, el seguimiento de cambios se debe habilitar previamente en el nivel de la base de datos. En el ejemplo siguiente se muestra cómo habilitar el seguimiento de cambios mediante ALTER DATABASE:

ALTER DATABASE AdventureWorks
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)

También puede habilitar el seguimiento de cambios en SQL Server Management Studio utilizando el cuadro de diálogo Propiedades de la base de datos (Página ChangeTracking).

Puede especificar las opciones CHANGE_RETENTION y AUTO_CLEANUP al habilitar el seguimiento de cambios, y puede cambiar los valores en cualquier momento una vez que esté habilitado.

El valor de retención de los cambios especifica el período de tiempo para el cual se conserva la información del seguimiento de cambios. La información del seguimiento de cambios anterior a este período de tiempo se quita periódicamente. A la hora de establecer este valor, debería tener en cuenta la frecuencia con que las aplicaciones se sincronizarán con las tablas en la base de datos. El período de retención especificado debe ser como mínimo igual al período máximo de tiempo entre sincronizaciones. Si una aplicación obtiene los cambios en intervalos más prolongados, los resultados que se devuelven podrían ser incorrectos, puesto que es posible que parte de la información de los cambios se haya quitado. Para evitar obtener resultados incorrectos, una aplicación puede utilizar la función del sistema CHANGE_TRACKING_MIN_VALID_VERSION con el fin de determinar si el intervalo entre las sincronizaciones ha sido demasiado largo.

Puede usar la opción AUTO_CLEANUP para habilitar o deshabilitar la tarea de limpieza que quita la información de seguimiento de cambios antigua. Se trata de algo que puede ser útil en los casos en que haya un problema temporal que evite que las aplicaciones se sincronicen y sea necesario paralizar el proceso de eliminación de información del seguimiento de cambios anterior al período de retención hasta que se resuelva el problema.

Tenga en cuenta lo siguiente para cualquier base de datos que utilice seguimiento de cambios:

  • Para utilizar el seguimiento de cambios, el nivel de compatibilidad de la base de datos debe establecerse en 90 o mayor. Si una base de datos tiene un nivel de compatibilidad menor que 90, puede configurar el seguimiento de cambios. Sin embargo, la función CHANGETABLE, que se utiliza para obtener información del seguimiento de cambios, devolverá un error.

  • El uso del aislamiento de instantánea es la manera más fácil de ayudarle a asegurarse de que toda la información del seguimiento de cambios es coherente. Por esta razón, recomendamos encarecidamente activar el aislamiento de instantánea para la base de datos. Para obtener más información, vea Uso del seguimiento de cambios.

Habilitación del seguimiento de cambios para una tabla

El seguimiento de cambios debe estar habilitado para cada tabla en la que desea realizar el seguimiento. Cuando el seguimiento de cambios se habilita, su información correspondiente se mantiene para todas las filas de la tabla a las que afecta una operación DML.

El ejemplo siguiente muestra cómo habilitar el seguimiento de cambios para una tabla utilizando ALTER TABLE:

ALTER TABLE Person.Contact
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)

También puede habilitar el seguimiento de cambios para una tabla en SQL Server Management Studio utilizando el cuadro de diálogo Propiedades de la tabla (Página ChangeTracking).

Cuando la opción TRACK_COLUMNS_UPDATED se activa, SQL Server Database Engine (Motor de base de datos de SQL Server) almacena información adicional acerca de las columnas que se actualizaron en la tabla de seguimiento de cambios interna. El seguimiento de columnas puede permitir a una aplicación sincronizar sólo las columnas que fueron actualizadas, lo cual puede mejorar la eficacia y el rendimiento. Sin embargo, dado que el mantenimiento de la información de seguimiento de las columnas agrega una sobrecarga adicional de almacenamiento, esta opción está desactivada de forma predeterminada.

Deshabilitación del seguimiento de cambios

El seguimiento de cambios para todas las tablas sometidas al seguimiento de cambios debe deshabilitarse antes de poder deshabilitar el seguimiento de cambios para toda la base de datos. Para determinar qué tablas de una base de datos tienen habilitado el seguimiento de cambios, utilice la vista de catálogo sys.change_tracking_tables.

El siguiente ejemplo muestra cómo deshabilitar el seguimiento de cambios para una tabla utilizando ALTER TABLE:

ALTER TABLE Person.Contact
DISABLE CHANGE_TRACKING;

Cuando ninguna de las tablas de una base de datos está sometida a seguimiento de cambios, es posible deshabilitar el seguimiento de cambios para la base de datos. En el ejemplo siguiente se muestra cómo deshabilitar el seguimiento de cambios para una base de datos mediante ALTER DATABASE:

ALTER DATABASE AdventureWorks
SET CHANGE_TRACKING = OFF

Administración del seguimiento de cambios

En las secciones siguientes se enumeran las vistas de catálogo, los permisos y los valores de configuración que son importantes para la administración del seguimiento de cambios.

Para determinar qué tablas y bases de datos tienen el seguimiento de cambios habilitado, puede utilizar las vistas de catálogo siguientes:

También, la vista de catálogo sys.internal_tables genera una lista de las tablas internas que se crean al habilitar el seguimiento de cambios para una tabla de usuario.

Seguridad

Para tener acceso a información del seguimiento de cambios mediante las funciones de seguimiento de cambios, la entidad de seguridad debe tener los permisos siguientes:

  • Permiso SELECT para la tabla que se consulta, por lo menos para las columnas de clave principal de la tabla sometida a seguimiento de cambios.

  • Permiso VIEW CHANGE TRACKING para la tabla para la que se obtienen los cambios. El permiso VIEW CHANGE TRACKING es necesario por las razones siguientes:

    • Los registros de seguimiento de cambios incluyen información sobre las filas que se han eliminado, en concreto los valores de clave principal de las filas eliminadas. Una entidad de seguridad podría haber obtenido el permiso SELECT para una tabla de seguimiento de cambios tras haberse eliminado de la misma datos confidenciales. En este caso, no sería aconsejable que esa entidad de seguridad pudiera tener acceso a la información eliminada utilizando el seguimiento de cambios.

    • El seguimiento de cambios puede contener información sobre qué columnas se han visto modificadas por las operaciones de actualización. Es posible que se le haya denegado a una entidad de seguridad el permiso para una columna que contiene información confidencial. Sin embargo, dado que la información del seguimiento de cambios está disponible, una entidad de seguridad puede determinar que el valor de una columna ha sido actualizado, pero no puede determinar el valor la citada columna.

Descripción de la sobrecarga que supone el seguimiento de cambios

Al habilitar el seguimiento de cambios para una tabla, algunas operaciones de administración quedan afectadas. En la tabla siguiente se enumeran las operaciones y los efectos que se deben considerar.

Operación

Cuando el seguimiento de cambios está habilitado

DROP TABLE

Se quita toda la información del seguimiento de cambios para la tabla quitada.

ALTER TABLE DROP CONSTRAINT

Se producirá un error en el intento de quitar la restricción PRIMARY KEY. Para poder quitar una restricción PRIMARY KEY, el seguimiento de cambios debe estar previamente deshabilitado.

ALTER TABLE DROP COLUMN

Si la columna que se desea quitar forma parte de la clave principal, no se permite la eliminación, independientemente del seguimiento de cambios.

Si la columna que se desea quitar no forma parte de la clave principal, la columna se quita correctamente. No obstante, es preciso ser consciente del efecto que se provocará en cualquier aplicación que esté sincronizando estos datos. Si el seguimiento de cambios de la columna está habilitado para la tabla, es posible que la columna quitada siga formando parte de la información del seguimiento de cambios obtenida. El trato que se deba dar a la columna quitada es responsabilidad de la aplicación.

ALTER TABLE ADD COLUMN

Si se agrega una columna nueva a la tabla sometida a seguimiento de cambios, la incorporación de la columna no se incluye en el seguimiento. Sólo se realiza el seguimiento de las actualizaciones y los cambios que se efectúen en la columna nueva.

ALTER TABLE ALTER COLUMN

No se realiza el seguimiento de los cambios del tipo de datos de las columnas que no pertenezcan a la clave primaria.

ALTER TABLE SWITCH

El intercambio de particiones produce un error si una o ambas tablas tienen el seguimiento de cambios habilitado.

DROP INDEX o ALTER INDEX DISABLE

El índice que exige la clave principal no se puede quitar o deshabilitar.

TRUNCATE TABLE

Es posible aplicar truncamiento sobre tablas que tengan el seguimiento de cambios habilitado. Sin embargo, no se realiza el seguimiento de las filas eliminadas por la operación, y se actualiza la versión válida mínima. Cuando una aplicación comprueba su versión, la comprobación indica que la versión es demasiado antigua y se requiere una reinicialización. Esto es lo mismo que deshabilitar el seguimiento de cambios y, a continuación, volverlo a habilitar para la tabla.

Cuando se usa el seguimiento de cambios, se agrega cierta sobrecarga a las operaciones DML debido a que la información correspondiente se almacena como parte de la operación.

Efectos en DML

El seguimiento de cambios se ha optimizado para minimizar la sobrecarga de rendimiento en operaciones DML. El incremento en la sobrecarga de rendimiento que se asocia al uso del seguimiento de cambios en una tabla es similar a la sobrecarga en que se incurre cuando se crea un índice para una tabla y hay que mantenerlo.

Para cada fila modificada por una operación DML, se agrega una fila a la tabla de seguimiento de cambios interna. El efecto de esta agregación en lo que respecta a la operación DML depende de factores tales como:

  • El número de columnas de clave principal

  • La cantidad de datos que se modifican en la fila de la tabla de usuario

  • El número de operaciones que se realizan en una transacción

El aislamiento de instantánea, si se usa, también afectará al rendimiento de todas las operaciones DML, esté habilitado o no el seguimiento de cambios.

Efectos en el almacenamiento

Los datos del seguimiento de cambios se almacenan en los tipos siguientes de tablas internas:

  • Tabla de cambios interna

    Hay una tabla de cambios interna para cada tabla de usuario que tenga habilitado el seguimiento de cambios.

  • Tabla de transacciones interna

    Hay una tabla de transacciones interna para la base de datos.

Estas tablas internas afectan a los requisitos de almacenamiento de las maneras siguientes:

  • Para cada cambio realizado en cada fila de la tabla de usuario, se agrega una fila a la tabla de cambios interna. Esta fila tiene una pequeña sobrecarga fija más una sobrecarga variable equivalente al tamaño de las columnas de clave principal. La fila puede contener información de contexto opcional establecida por una aplicación. Y, si el seguimiento de la columna está habilitado, cada columna modificada requiere 4 bytes en la tabla de seguimiento.

  • Por cada transacción confirmada, se agrega una fila a una tabla de transacciones interna.

Como en el caso de otras tablas internas, es posible determinar el espacio utilizado para las tablas de seguimiento de cambios mediante el procedimiento almacenado sp_spaceused. Los nombres de las tablas internas se pueden obtener mediante la vista de catálogo sys.internal_tables, como se muestra en el ejemplo siguiente.

sp_spaceused 'sys.change_tracking_309576141'
sp_spaceused 'sys.syscommittab'