Limitaciones y consideraciones de las tablas temporalesTemporal Table Considerations and Limitations

SE APLICA A: síSQL Server síAzure SQL Database noAzure Synapse Analytics (SQL DW) noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server yesAzure SQL Database noAzure Synapse Analytics (SQL DW) noParallel Data Warehouse

Hay algunas consideraciones y limitaciones que deben tenerse en cuenta al trabajar con tablas temporales debido a la naturaleza de las versiones del sistema.There are some considerations and limitations to be aware of when working with temporal tables, due to the nature of system-versioning.

Tenga en cuenta lo siguiente al trabajar con tablas temporales:Consider the following when working with temporal tables:

  • Una tabla temporal debe tener una clave principal definida para correlacionar los registros entre la tabla actual y la de historial; esta última no puede tener definida una clave principal.A temporal table must have a primary key defined in order to correlate records between the current table and the history table, and the history table cannot have a primary key defined.

  • Las columnas de periodo SYSTEM_TIME que se usan para registrar los valores SysStartTime y SysEndTime deben definirse con una propiedad datatype de datetime2.The SYSTEM_TIME period columns used to record the SysStartTime and SysEndTime values must be defined with a datatype of datetime2.

  • Si el nombre de una tabla de historial se especifica durante su creación, debe determinar el nombre del esquema y la tabla.If the name of a history table is specified during history table creation, you must specify the schema and table name.

  • De forma predeterminada, es la tabla de historial es PAGE comprimida.By default, the history table is PAGE compressed.

  • Si la tabla actual tiene particiones, la tabla de historial se crea en el grupo de archivos predeterminado, ya que la configuración de particiones no se replica automáticamente desde la tabla actual a la de historial.If current table is partitioned, the history table is created on default file group because partitioning configuration is not replicated automatically from the current table to the history table.

  • Las tablas temporales y de historial no pueden ser FILETABLE y pueden contener columnas de cualquier tipo de datos compatible que no sea FILESTREAM , ya que FILETABLE y FILESTREAM permiten que se puedan manipular datos fuera de SQL ServerSQL Server ; por tanto, no se puede garantizar el control de versiones del sistema.Temporal and history tables cannot be FILETABLE and can contain columns of any supported datatype other than FILESTREAM since FILETABLE and FILESTREAM allow data manipulation outside of SQL ServerSQL Server and thus system versioning cannot be guaranteed.

  • Un nodo o una tabla perimetral no se puede crear o modificar como una tabla temporal.A node or edge table cannot be created as or altered to a temporal table.

  • Aunque las tablas temporales son compatibles con los tipos de datos BLOB, como (n)varchar(max) , varbinary(max) , (n)text e image, acarrearán importantes costos de almacenamiento y afectarán al rendimiento debido a su tamaño.While temporal tables support blob data types, such as (n)varchar(max), varbinary(max), (n)text, and image, they will incur significant storage costs and have performance implications due to their size. Por lo tanto, al diseñar el sistema, debe tener cuidado al usar estos tipos de datos.As such, when designing your system, care should be taken when using these data types.

  • La tabla de historial debe crearse en la misma base de datos que donde reside la actual.History table must be created in the same database as the current table. No se admiten las consultas temporales en Linked Server .Temporal querying over Linked Server is not supported.

  • La tabla de historial no puede tener restricciones (de clave principal, clave externa, tabla o columna).History table cannot have constraints (primary key, foreign key, table or column constraints).

  • No se admiten vistas indexadas con consultas temporales (las consultas que usan la cláusula FOR SYSTEM_TIME).Indexed views are not supported on top of temporal queries (queries that use FOR SYSTEM_TIME clause).

  • La opción en línea (WITH (ONLINE = ON) no tiene ningún efecto sobre ALTER TABLE ALTER COLUMN en las tablas temporales con versiones del sistema.Online option (WITH (ONLINE = ON) has no effect on ALTER TABLE ALTER COLUMN in case of system-versioned temporal table. La columna ALTER no se realiza en línea, independientemente del valor que se especificó para la opción ONLINE.ALTER column is not performed as online regardless of which value was specified for ONLINE option.

  • Las instruccionesINSERT y UPDATE no pueden hacer referencia a las columnas de periodo SYSTEM_TIME.INSERT and UPDATE statements cannot reference the SYSTEM_TIME period columns. Se bloquearán los intentos de insertar valores directamente en estas columnas.Attempts to insert values directly into these columns will be blocked.

  • TRUNCATE TABLE no se admite mientras SYSTEM_VERSIONING esté configurado como ONTRUNCATE TABLE is not supported while SYSTEM_VERSIONING is ON

  • No se permite la modificación directa de los datos en una tabla de historial.Direct modification of the data in a history table is not permitted.

  • ON DELETE CASCADE y ON UPDATE CASCADE no se permiten en la tabla actual.ON DELETE CASCADE and ON UPDATE CASCADE are not permitted on the current table. Es decir, cuando la tabla temporal hace referencia a la tabla de la relación de clave externa (correspondiente a parent_object_id en sys.foreign_keys), no se permiten las opciones CASCADE.In other words, when temporal table is referencing table in the foreign key relationship (corresponding to parent_object_id in sys.foreign_keys) CASCADE options are not allowed. Para solucionar esta limitación, use la lógica de aplicación o los desencadenadores AFTER para mantener la coherencia de eliminación en la tabla de clave principal (correspondiente a referenced_object_id en sys.foreign_keys).To work around this limitation, use application logic or after triggers to maintain consistency on delete in primary key table (corresponding to referenced_object_id in sys.foreign_keys). Si la tabla de clave principal es temporal y la de referencia no lo es, significa que no hay ninguna limitación de este tipo.If primary key table is temporal and referencing table is non-temporal, there's no such limitation.

    Nota

    Esta limitación solo se aplica a SQL Server 2016.This limitation applies to SQL Server 2016 only. Se admiten opciones CASCADE en SQL DatabaseSQL Database y a partir de la versión CTP 2.0 de SQL Server 2017.CASCADE options are supported in SQL DatabaseSQL Database and SQL Server 2017 starting from CTP 2.0.

  • Los desencadenadoresINSTEAD OF no se permiten en la tabla actual o de historial para evitar que se invalide la lógica DML.INSTEAD OF triggers are not permitted on either the current or the history table to avoid invalidating the DML logic. Los desencadenadoresAFTER solo se permiten en la tabla actual.AFTER triggers are permitted only on the current table. Se bloquean en la tabla de historial para evitar que se invalide la lógica DML.They are blocked on the history table to avoid invalidating the DML logic.

  • El uso de tecnologías de replicación está limitado:Usage of replication technologies is limited:

    • Always On: totalmente compatibleAlways On: Fully supported
    • Captura de datos modificados y seguimiento de cambios: solo se admite en la tabla actualChange Data Capture and Change Data Tracking: Supported only on the current table
    • Replicación transaccional y de instantáneas: solo se admite para un publicador único sin la función de temporalidad habilitada, y un suscriptor que tenga esa función habilitada.Snapshot and transactional replication: Only supported for a single publisher without temporal being enabled and one subscriber with temporal enabled. En este caso, el publicador se usa para una carga de trabajo OLTP, mientras que el suscriptor sirve para la descarga de informes (incluidas las consultas "AS OF").In this case, the publisher is used for an OLTP workload while subscriber serves for offloading reporting (including 'AS OF' querying). No se admite el uso de varios suscriptores, puesto que este escenario puede provocar que los datos temporales sean incoherentes (cada uno de ellos dependería del reloj del sistema local).Use of multiple subscribers is not supported since this scenario may lead to inconsistent temporal data as each of them would depend on the local system clock.
    • Replicación de mezcla: no es compatible con las tablas temporalesMerge replication: Not supported for temporal tables
  • Las consultas normales solo afectan a los datos de la tabla actual.Regular queries only affect data in the current table. Para consultar los datos en la tabla de historial, debe usar consultas temporales.To query data in the history table, you must use temporal queries. Este asunto se explica más adelante en este documento, en la sección titulada "Consulta de datos temporales".These are discussed later in this document in the section entitled Querying Temporal Data.

  • Una estrategia de indexación óptima consiste en incluir un índice de almacén de columnas agrupado o un índice de almacén de filas de árbol B en la tabla actual, así como un índice de almacén de columnas agrupado en la tabla de historial para que el rendimiento y el tamaño de almacenamiento sean óptimos.An optimal indexing strategy will include a clustered columns store index and / or a B-tree rowstore index on the current table and a clustered columnstore index on the history table for optimal storage size and performance. Si crea o usa su propia tabla de historial, recomendamos encarecidamente que genere este tipo de índice que consta de columnas de periodo empezando por el fin de la columna de periodo con el fin de acelerar las consultas temporales y las que forman parte de la comprobación de coherencia de datos.If you create / use your own history table, we strongly recommend that you create this type of index consisting of period columns starting with the end of period column to speed up temporal querying as well as speeding up the queries that are part of the data consistency check. La tabla de historial predeterminada cuenta con un índice de almacén de filas agrupado que se ha creado en función de las columnas de periodo (fin e inicio).The default history table has a clustered rowstore index created for you based on the period columns (end, start). Como mínimo, se recomienda un índice de almacén de filas no agrupado.At a minimum, a nonclustered rowstore index is recommended.

  • Los objetos o las propiedades siguientes no se replican desde la tabla actual en la de historial cuando se crea la tabla de historial:The following objects/properties are not replicated from the current to the history table when the history table is created:

    • Definición de periodoPeriod definition
    • Definición de identidadIdentity definition
    • ÍndicesIndexes
    • EstadísticasStatistics
    • Restricciones CHECKCheck constraints
    • DesencadenadoresTriggers
    • Configuración de particiónPartitioning configuration
    • PermisosPermissions
    • Predicados de seguridad de nivel de filaRow-level security predicates
  • Una tabla de historial no puede configurarse como actual en una cadena de tablas de historial.A history table cannot be configured as current table in a chain of history tables.

Consulte tambiénSee Also