2016-11-09 45 views
7

Mam wiele tabel z danymi, które chcę przekonwertować na tabelę Microsoft Temporal, Ale kiedy chcę przekonwertować tabelę temporalną, straciłem moje dane. Mój kod to:W jaki sposób można modyfikować tabele istnienie w tabeli tymczasowej SQL, zachowując dane?

Alter TABLE dbo.Employee 
( 
    [EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED 
    , [Name] nvarchar(100) NOT NULL 
    , [Position] varchar(100) NOT NULL 
    , [Department] varchar(100) NOT NULL 
    , [Address] nvarchar(1024) NOT NULL 
    , [AnnualSalary] decimal (10,2) NOT NULL 
    , [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START 
    , [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END 
    , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo) 
)  
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory)); 

jak można zmieniać tabele istnienie SQL tabeli czasowej poprzez utrzymywanie danych?

Odpowiedz

2

Najpierw należy dodać dwie kolumny dla okresu systemowego do dowolnych tabel. tak:

CREATE TABLE DepartmentHistory 
( 
    DeptID int NOT NULL 
    , DeptName varchar(50) NOT NULL 
    , SysStartTime datetime2 NOT NULL 
    , SysEndTime datetime2 NOT NULL 
); 
GO 
CREATE CLUSTERED COLUMNSTORE INDEX IX_DepartmentHistory 
    ON DepartmentHistory; 
CREATE NONCLUSTERED INDEX IX_DepartmentHistory_ID_PERIOD_COLUMNS 
    ON DepartmentHistory (SysEndTime, SysStartTime, DeptID); 
GO 
CREATE TABLE Department 
( 
    DeptID int NOT NULL PRIMARY KEY CLUSTERED 
    , DeptName varchar(50) NOT NULL 
    , SysStartTime datetime2 NOT NULL 
    , SysEndTime datetime2 NOT NULL   
) ; 

w kodach górę, SysStartTime i SysEndTime ma kolumn okres czasu systemowego.

Następnie można przekonwertować je na stołach Temporal łatwo:

ALTER TABLE dbo.Department 
    ADD PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime]) 
ALTER TABLE dbo.Department  
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.DepartmentHistory, DATA_CONSISTENCY_CHECK = ON)); 

A jeśli masz tabelę czasową i chcesz edytować tabele schematu, więc można to zrobić przez ten kod:

ALTER TABLE Test.dbo.Department 
    SET (SYSTEM_VERSIONING = OFF) 
5
  1. Utwórz tabelę czasową.

  2. Wstaw dane z oryginalnej tabeli do tabeli tymczasowej.

  3. Upuść oryginalny stół.

+1

Mam wiele stołów może 100 stołów i myślę, że ten sposób nie nadaje się do wszystkich tabel za każdym razem. dzięki za odpowiedź. –

1

Włączyć system wersji w tabeli Employee w dwóch etapach

  1. dodać nowe kolumny okresu (Ukryte)
  2. utworzyć domyślną Historia stół

    ALTER TABLE Employee 
    ADD 
    ValidFrom datetime2 (2) GENERATED ALWAYS AS ROW START HIDDEN  
        constraint DF_ValidFrom DEFAULT DATEADD(second, -1, SYSUTCDATETIME()) 
    , ValidTo datetime2 (2) GENERATED ALWAYS AS ROW END HIDDEN  
        constraint DF_ValidTo DEFAULT '9999.12.31 23:59:59.99' 
    , PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo); 
    
    ALTER TABLE Employee  
    SET (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.Employee_History)); 
    

Po wykonaniu powyższy skrypt, wszystkie zmiany danych zostaną zebrane transparentl y w tabeli historii. W typowym scenariuszu z audytami danych należy wyszukiwać wszystkie zmiany danych, które zostały zastosowane do pojedynczego wiersza w okresie będącym przedmiotem zainteresowania. Domyślna tabela historii jest tworzona w klastrze B-Tree składowania wierszy, aby skutecznie adresować ten przypadek użycia.