web-dev-qa-db-fra.com

Tables temporelles SQL Server 2016

Quelqu'un a-t-il essayé des tables temporelles prépopulées avec de vieilles données d'histoire? Avant de décider d'utiliser des tables temporelles, nous devons pouvoir importer notre ancienne histoire.

5
Debra

Oui, vous pouvez importer une vieille histoire dans les tables d'histoire. Voici un exemple rapide qui montre comment faire cela - vous devez désactiver temporairement la version du système.

CREATE TABLE dbo.TemporalExampleHistory
(
  TemporalID int NOT NULL,
  UserName   sysname,
  ValidFrom  datetime2 NOT NULL,
  ValidTo    datetime2 NOT NULL
);
GO

CREATE TABLE dbo.TemporalExample
(
  TemporalID int PRIMARY KEY,
  UserName   sysname,
  ValidFrom  datetime2 GENERATED ALWAYS AS ROW START NOT NULL,
  ValidTo    datetime2 GENERATED ALWAYS AS ROW END   NOT NULL,
  PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
) 
WITH
(
  SYSTEM_VERSIONING = ON 
  (
    HISTORY_TABLE = dbo.TemporalExampleHistory
  )
);

Maintenant, insérez quelques données:

INSERT dbo.TemporalExample(TemporalID, UserName)
  VALUES(1,N'Bob'),(2,N'Frank');

-- update a row to make some history:

UPDATE dbo.TemporalExample
  SET UserName = N'Frankie'
  WHERE TemporalID = 2;

Valider Il y a une ligne de la version de la version système dans la table d'histoire:

SELECT * FROM dbo.TemporalExampleHistory;

Maintenant, pour insérer des rangées dans l'historique. Exécuter ces étapes une à la fois; L'analyseur empêchera l'insert si ceux-ci sont tous dans un seul lot.

BEGIN TRANSACTION; -- may want SERIALIZABLE here

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

INSERT dbo.TemporalExampleHistory(TemporalID, UserName, ValidFrom, ValidTo)
  SELECT TOP (1) TemporalID, N'Little Frankie', '19000101', ValidFrom
    FROM dbo.TemporalExampleHistory 
    WHERE TemporalID = 2
    ORDER BY ValidFrom;

ALTER TABLE dbo.TemporalExample SET
(
  SYSTEM_VERSIONING = ON 
  (
    HISTORY_TABLE = dbo.TemporalExampleHistory,
    DATA_CONSISTENCY_CHECK = ON
  )
);

COMMIT TRANSACTION;

Maintenant, validez-vous maintenant deux rangées Verseed d'ID = 2 dans la table d'histoire:

SELECT * FROM dbo.TemporalExampleHistory;
4
Aaron Bertrand

Grande question!

Pour copier les données de vos tables de journal actuels, vous pouvez écrire un script simple pour peupler la table Histoire. N'oubliez pas que vous aurez temporal et historique Tables créées, assurez-vous donc d'insérer dans le bon. En supposant que votre table de journaux actuelle conserve une trace de "Insérer", "Mettre à jour" et "Supprimer", vous devez écrire un script qui pourrait insérer comme:

  • Insérer - Insérez toutes les commandes "Insérer" de la table du journal actuel. Démarrage défini sur la table actuelle [LOGDT], la minuterie est définie sur la valeur max (9999-12-31)

  • Mise à jour - Etant donné que l'instruction de mise à jour insère l'ancienne ligne de la table d'historique, votre script devra trouver toutes les lignes que votre relevé de mise à jour est en train de mettre à jour (ceux-ci seront "Insérer" ou "Mettre à jour" les commandes) et entrez ces lignes. Starttime Soyez [logdt], la durée de gamme est définie sur Max Value (9999-12-31)

  • Supprimer - Même chose que la mise à jour, vous devrez trouver l'ancienne ligne que cette déclaration a réellement supprimé. Mintérieur sera [logdt] de Supprimer la commande et la démarrage serait [logdt] de la mise à jour précédente ou d'insérer cette instruction supprimée

Je n'écris pas un script car il change pour tous les cas d'utilisation, mais j'espère que cela vous donne une idée de ce que vous pouvez faire pour importer de vieux tables de journaux dans la table d'histoire.

1
Tigerjz32