Compartir por


Detención del control de versiones en una tabla temporal con control de versiones del sistema

Se aplica a: SQL Server 2016 (13.x) y versiones posteriores Azure SQL Database Azure SQL Managed Instance

Es posible que quiera detener el control de versiones en una tabla temporal de forma temporal o permanente. Puede hacerlo si establece la cláusula SYSTEM_VERSIONING en OFF.

Establecimiento de SYSTEM_VERSIONING = OFF

Detenga el control de versiones del sistema si quiere realizar operaciones de mantenimiento concretas en una tabla temporal o ya no necesita una tabla con control de versiones. Como resultado de esta operación obtiene dos tablas independientes:

  • Tabla actual con una definición del período
  • Tabla de historial como una tabla normal

Comentarios

La tabla de historial deja de capturar las actualizaciones durante SYSTEM_VERSIONING = OFF.

No se produce ninguna pérdida de datos en la tabla temporal cuando se establece SYSTEM_VERSIONING = OFF o se quita el periodo SYSTEM_TIME.

Si establece SYSTEM_VERSIONING = OFF y no quita el periodo SYSTEM_TIME, el sistema sigue actualizando las columnas de periodo en cada operación de inserción y actualización. Si elimina contenido de la tabla actual, no podrá recuperarlo.

Debe quitar el punto SYSTEM_TIME para eliminar las columnas de periodo. Para quitar las columnas de periodo, use ALTER TABLE <table> DROP <column>;. Para más información, vea Cambio del esquema de una tabla temporal con control de versiones del sistema.

Al establecer SYSTEM_VERSIONING = OFF, todos los usuarios con permisos suficientes pueden modificar el esquema y el contenido de la tabla de historial o incluso eliminarla permanentemente.

No puede establecer SYSTEM_VERSIONING = OFF si tienen otros objetos creados con SCHEMABINDING mediante extensiones de consultas temporales, como las referencias a SYSTEM_TIME. Esta restricción impide que se produzcan errores en estos objetos si se establece SYSTEM_VERSIONING = OFF.

Quitar permanentemente SYSTEM_VERSIONING

En este ejemplo se quita permanentemente SYSTEM_VERSIONING y se eliminan las columnas de periodo. La eliminación de las columnas de período es opcional.

ALTER TABLE dbo.Department
SET (SYSTEM_VERSIONING = OFF);

-- Optionally, DROP PERIOD if you want to revert temporal table to a non-temporal
ALTER TABLE dbo.Department
DROP PERIOD FOR SYSTEM_TIME;

Quitar temporalmente SYSTEM_VERSIONING

La lista siguiente contiene las operaciones que exigen que el control de versiones del sistema esté establecido en OFF:

  • Eliminación de datos innecesarios del historial (DELETE o TRUNCATE)
  • Eliminación de datos de la tabla actual sin control de versiones (DELETE, TRUNCATE)
  • Partición de SWITCH OUT desde la tabla actual
  • Partición de SWITCH IN en la tabla de historial

En este ejemplo se detiene temporalmente SYSTEM_VERSIONING para que se puedan realizar operaciones de mantenimiento concretas. Si detiene temporalmente el control de versiones como un requisito previo para el mantenimiento de una tabla, se recomienda encarecidamente hacerlo en una transacción para mantener la coherencia de los datos.

Al volver a activar el control de versiones del sistema, no olvide especificar el argumento HISTORY_TABLE. Si no lo hace, se crea una tabla de historial que se asocia con la tabla actual. La tabla de historial original puede seguir existiendo como una tabla normal, pero ya no está asociada con la tabla actual.

BEGIN TRANSACTION;

ALTER TABLE dbo.Department
SET (SYSTEM_VERSIONING = OFF);

TRUNCATE TABLE [History].[DepartmentHistory]
WITH (PARTITIONS(1, 2));

ALTER TABLE dbo.Department
SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = History.DepartmentHistory));

COMMIT;