Considérations et limitations liées aux tables temporellesTemporal Table Considerations and Limitations

S’applique à :Applies to: ouiSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) et ultérieures OuiAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database OuiAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed InstanceS’applique à :Applies to: ouiSQL Server 2016 (13.x)SQL Server 2016 (13.x)yesSQL Server 2016 (13.x)SQL Server 2016 (13.x) and later OuiAzure SQL DatabaseAzure SQL DatabaseYesAzure SQL DatabaseAzure SQL Database OuiAzure SQL Managed InstanceAzure SQL Managed InstanceYesAzure SQL Managed InstanceAzure SQL Managed Instance

Certaines considérations et limitations sont pertinentes lorsque vous travaillez avec des tables temporelles en raison de la nature de la gestion de versions par le système.There are some considerations and limitations to be aware of when working with temporal tables, due to the nature of system-versioning.

Prenez les points suivants en compte lorsque vous travaillez avec des tables temporelles :Consider the following when working with temporal tables:

  • Une table temporelle doit avoir une clé primaire définie afin de mettre en corrélation les enregistrements de la table actuelle et la table d’historique. Et la table d’historique ne peut pas avoir une clé primaire définie.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.

  • Les colonnes de période SYSTEM_TIME utilisées pour enregistrer les valeurs SysStartTime et SysEndTime doivent être définies avec le type de données datetime2.The SYSTEM_TIME period columns used to record the SysStartTime and SysEndTime values must be defined with a datatype of datetime2.

  • Si le nom d’une table d’historique est spécifié lors de sa création, vous devez spécifier le nom du schéma et de la table.If the name of a history table is specified during history table creation, you must specify the schema and table name.

  • Par défaut, la table d’historique est PAGE compressée.By default, the history table is PAGE compressed.

  • Si la table actuelle est partitionnée, la table d’historique est créée sur le groupe de fichiers par défaut car la configuration du partitionnement n’est pas répliquée automatiquement de la table actuelle dans la table d’historique.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.

  • Les tables temporelle et d’historique ne peuvent pas être FILETABLE et peuvent contenir des colonnes de n’importe quel type de données pris en charge autre que FILESTREAM , car FILETABLE et FILESTREAM permettent de manipuler des données en dehors de SQL ServerSQL Server , ce qui ne garantit pas la gestion système des versions.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.

  • Une table de nœuds ou d’arêtes ne peut pas être créée ou modifiée en tant que table temporelle.A node or edge table cannot be created as or altered to a temporal table.

  • Même si les tables temporelles prennent en charge les types de données blob, tels que (n)varchar(max) , varbinary(max) , (n)text et image, elles entraînent des coûts de stockage importants et ont un impact sur les performances en raison de leur taille.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. Par conséquent, il convient de prendre des précautions lorsque vous concevez votre système si vous souhaitez utiliser ces types de données .As such, when designing your system, care should be taken when using these data types.

  • La table d’historique doit être créée dans la même base de données que le tableau actuel.History table must be created in the same database as the current table. L’interrogation temporelle par l’intermédiaire de Linked Server n’est pas prise en charge.Temporal querying over Linked Server is not supported.

  • La table d’historique ne peut pas avoir de contraintes (clé primaire, clé étrangère, contraintes de table ou de colonne).History table cannot have constraints (primary key, foreign key, table or column constraints).

  • Les vues indexées ne sont pas prises en charge sur les requêtes temporelles (requêtes qui utilisent la clause FOR SYSTEM_TIME).Indexed views are not supported on top of temporal queries (queries that use FOR SYSTEM_TIME clause).

  • L’option Online (WITH (ONLINE = ON) n’a aucun effet sur ALTER TABLE ALTER COLUMN si la version de table temporelle est contrôlée par le système.Online option (WITH (ONLINE = ON) has no effect on ALTER TABLE ALTER COLUMN in case of system-versioned temporal table. L’opération ALTER COLUMN n’est pas effectuée en ligne, quelle que soit la valeur spécifiée pour l’option ONLINE.ALTER column is not performed as online regardless of which value was specified for ONLINE option.

  • Les instructionsINSERT et UPDATE ne peuvent pas faire référence à des colonnes de période SYSTEM_TIME.INSERT and UPDATE statements cannot reference the SYSTEM_TIME period columns. Les tentatives d’insertion de valeurs directement dans ces colonnes sont bloquées.Attempts to insert values directly into these columns will be blocked.

  • TRUNCATE TABLE n’est pas pris en charge quand SYSTEM_VERSIONING a la valeur ONTRUNCATE TABLE is not supported while SYSTEM_VERSIONING is ON

  • La modification directe des données dans une table d’historique n’est pas autorisée.Direct modification of the data in a history table is not permitted.

  • ON DELETE CASCADE et ON UPDATE CASCADE ne sont pas autorisées dans la table actuelle.ON DELETE CASCADE and ON UPDATE CASCADE are not permitted on the current table. En d’autres termes, quand la table temporelle fait référence à la table dans la relation de clé étrangère (correspondant à parent_object_id dans sys.foreign_keys), les options CASCADE ne sont pas autorisées.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. Pour contourner cette limitation, utilisez une logique d’application ou des déclencheurs After pour maintenir la cohérence en cas de suppression dans la table de clé primaire (correspondant à referenced_object_id dans 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 table de clé primaire est temporelle alors que la table de référence ne l’est pas, il n’existe aucune limitation de ce type.If primary key table is temporal and referencing table is non-temporal, there's no such limitation.

    Notes

    cette limitation s’applique uniquement à SQL Server 2016.This limitation applies to SQL Server 2016 only. Les options CASCADE sont prises en charge dans SQL DatabaseSQL Database et SQL Server 2017 à partir de la version CTP 2.0.CASCADE options are supported in SQL DatabaseSQL Database and SQL Server 2017 starting from CTP 2.0.

  • Les déclencheursINSTEAD OF ne sont pas autorisés sur la table actuelle ou sur la table d’historique pour éviter l’invalidation de la logique DML.INSTEAD OF triggers are not permitted on either the current or the history table to avoid invalidating the DML logic. Les déclencheursAFTER sont autorisés uniquement dans la table actuelle.AFTER triggers are permitted only on the current table. Ils sont bloqués dans la table d’historique afin d’éviter l’invalidation de la logique DML.They are blocked on the history table to avoid invalidating the DML logic.

  • L’utilisation de technologies de réplication est limitée :Usage of replication technologies is limited:

    • Always On (Toujours active) : entièrement prise en chargeAlways On: Fully supported
    • Capture de données modifiées et suivi des modifications : uniquement prise en charge sur la table actuelleChange Data Capture and Change Data Tracking: Supported only on the current table
    • Capture instantanée et réplication transactionnelle : uniquement prise en charge pour un serveur de publication unique sans activation de Temporal et un abonné avec Temporal activé.Snapshot and transactional replication: Only supported for a single publisher without temporal being enabled and one subscriber with temporal enabled. Dans ce cas, le serveur de publication est utilisé pour une charge de travail OLTP tandis que l’abonné est utilisé pour le déchargement de rapports (avec l’interrogation « AS OF »).In this case, the publisher is used for an OLTP workload while subscriber serves for offloading reporting (including 'AS OF' querying). Lorsque l’agent de distribution démarre, il ouvre une transaction qui est maintenue ouverte jusqu’à ce que l’agent de distribution s’arrête.When the distribution agent starts, it opens a transaction that is held open until distribution agent stops. En raison de ce comportement, SysStartTime et SysEndTime sont remplis avec l’heure de début de la première transaction démarrée par l’agent de distribution.Due to this behavior SysStartTime and SysEndTime are populated to the begin time of the first transaction that distribution agent starts. Il est peut-être donc préférable d’exécuter l’agent de distribution selon une planification et non en continu comme le veut le comportement par défaut s’il est important pour votre application ou votre organisation que SysStartTime et SysEndTime soient remplis avec une heure proche de l’heure système actuelle.Consequently, it may be preferable to run the distribution agent on a schedule rather than the default behavior of running it continuously, if having SysStartTime and SysEndTime populated with a time that is close to the current system time is important to your application or organization. L’utilisation de plusieurs abonnés n’est pas prise en charge, car cela peut entraîner des données temporelles incohérentes en raison de la dépendance sur l’horloge système locale.Use of multiple subscribers is not supported as this may lead to inconsistent temporal data due to dependency on local system clock.
    • Réplication de fusion : non prise en charge pour les tables temporellesMerge replication: Not supported for temporal tables
  • Les requêtes régulières affectent uniquement les données dans la table actuelle.Regular queries only affect data in the current table. Pour interroger des données dans la table d’historique, vous devez utiliser des requêtes temporelles.To query data in the history table, you must use temporal queries. Ces points sont abordés dans ce document dans la section Interrogation des données temporelles.These are discussed later in this document in the section entitled Querying Temporal Data.

  • Une stratégie d’indexation optimale inclut stockage de colonnes d’index en cluster et / ou un index rowstore d’arbre B (B-tree) dans la table actuelle et un index columnstore en cluster dans la table d’historique pour des performances et une taille de stockage optimales.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 vous créez / utilisez votre propre table d’historique, nous vous recommandons vivement de créer ce type d’index comportant des colonnes de période en commençant à la fin de la colonne de période pour accélérer le traitement des requêtes temporelles et des requêtes qui font partie de la vérification de cohérence des données.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 table d’historique par défaut a un index rowstore en cluster créé selon les colonnes de période (début, fin).The default history table has a clustered rowstore index created for you based on the period columns (end, start). Nous recommandons au minimum un index rowstore non-cluster.At a minimum, a nonclustered rowstore index is recommended.

  • Les objets/propriétés suivantes ne sont pas répliquées à partir à la table d’historique actuelle lors de la création de la table d’historique :The following objects/properties are not replicated from the current to the history table when the history table is created:

    • Définition de la périodePeriod definition
    • Définition de l’identitéIdentity definition
    • IndexIndexes
    • StatistiquesStatistics
    • Contraintes de validationCheck constraints
    • DéclencheursTriggers
    • Configuration du partitionnementPartitioning configuration
    • AutorisationsPermissions
    • Prédicats de sécurité au niveau des lignesRow-level security predicates
  • Une table d’historique ne peut pas être configurée en tant que table actuelle d’une chaîne de tables d’historique.A history table cannot be configured as current table in a chain of history tables.

Voir aussiSee Also