Actualmente estoy aprendiendo la nueva "Tabla temporal con versiones del sistema" introducida en SQL Server 2016. Sin embargo, me está costando un poco entender el significado exacto y el uso de "GENERADO SIEMPRE COMO INICIO / FIN DE FILA" y "PERIOD FOR SYSTEM_TIME", los cuales son requeridos por la tabla temporal versionada del sistema.

¿Podría alguien explicarme por favor? ¡Gracias de antemano por cualquier ayuda!

CREATE TABLE dbo.Employees
(
    empid INT NOT NULL CONSTRAINT PK_Employees PRIMARY KEY NONCLUSTERED,
    empname VARCHAR(25) NOT NULL,
    department VARCHAR(50) NOT NULL,
    salary NUMERIC(10, 2) NOT NULL,

    sysstart DATETIME2(0) GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,

    sysend DATETIME2(0) GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,

    PERIOD FOR SYSTEM_TIME(sysstart, sysend),
    INDEX ix_Employees CLUSTERED(empid, sysstart, sysend)
)

WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeesHistory)
);
7
Thor 14 dic. 2016 a las 03:03

2 respuestas

La mejor respuesta

Tablas temporales en SQL Server 2016

Esta es una nueva característica sorprendente en SQL Server 2016 y versiones posteriores.

En Quick points, ¿Qué son las tablas temporales?

  • Introducido en 2011 por ANSI / ISO para SQL
  • IBM DB2 y Oracle 10g, 11g y 12c fueron los primeros en adoptar.
  • Diseñado para mantener un historial completo de cambios de datos y permitir un fácil análisis puntual en el tiempo.
  • Cada tabla temporal tiene dos columnas definidas explícitamente, cada una con un tipo de datos datetime2.

De MSDN

Una tabla temporal con versión del sistema debe tener una clave primaria definida y tener exactamente un PERIODO PARA SYSTEM_TIME definido con dos columnas datetime2, declaradas como GENERADA SIEMPRE COMO ROW START / END

Por lo tanto, la clave principal para la tabla A system-versioned (considérelo como un apodo de la tabla temporal) está definida y tiene exactamente una PERIOD FOR SYSTEM_TIME definida con dos columnas datetime2 para permitir un fácil análisis de un punto en el tiempo o Viaje en el tiempo (Como dijo Borko Novakovic en Channel 9), declarado como GENERATED ALWAYS AS ROW START / END

Referencias:

3
David Spillett 19 jul. 2018 a las 12:40

La tabla Temporal con versión del sistema usa la unidad de tiempo para rastrear cualquier cambio de fila con la columna use 2 de tipo DateTime2 (hora de inicio y finalización). Al usar DateTime2, SQL obtiene la hora exacta independientemente de la zona horaria.

SYSTEM_TIME se usa como PERIOD al verificar la hora de inicio y finalización y este campo también se usa para la instrucción de selección para obtener registros de historial de transacciones y tablas de historial.

SELECT * FROM [Your_Table]
    FOR SYSTEM_TIME    
        BETWEEN '2014-01-01 00:00:00.0000000' AND '2015-01-01 00:00:00.0000000'
0
Abdul Azeez 12 oct. 2017 a las 14:34