zoukankan      html  css  js  c++  java
  • [译]SQL SERVER 2016 – Temporal Tables

    原文

    Temporal Table是SQL Server2016的新特性。能存储你表里面任意时间点的数据信息。 换句话说,如果你针对一张表执行任何更新或者删除操作,老数据会被新数据覆盖,下次查询的时候是查的最新的数据,但如果使用了temporal table你可以查询到任意时间点的数据。

    Temporal table是如何工作的呢?

    当你往Temporal table插入记录的时候会发生什么?

    当你往temporal table插入数据的时候,数据会留在temporal table中,但是不会影响history table。

    当你更新或者删除Temporal table的数据时会发生什么?

    当你更新或者删除Temporal table的数据时,已存在的记录会先被移动到history table中,记录temporal table数据的改变。

    当你查询Temporal table的时候会发生什么?

    当你查询temporal table的时候, temporal table会自己决定是从temporal table中还是从history table中返回数据,你不应该使用任何join关联temporal table和history table进行查询。

    创建Temporal Table

    创建temporal table时,其对应的history table会自动创建(如果你已经有了一个history table,你可以将他和temporal table关联起来)。下面是一个普通的创建表的脚本,但是有些额外特殊的列。这些列用来定义temporal table的period definition,并且这些列是隐藏的。当你查询的时候这些列不会出现在结果集中。脚本中还将history table名指定为“dbo.tbl_Product_History”。当然你也可以不声明history table的名字,SQL会自动为temporal table创建一个默认的history table。

    CREATE DATABASE SampleDB
    GO
    USE SampleDB
    GO
    --DROP TABLE tbl_Product
    --GO
    CREATE TABLE tbl_Product
    (
        Product_ID int NOT NULL PRIMARY KEY CLUSTERED,
        Product_Name varchar(50) NOT NULL,
        Rate numeric(18,2),
     
        /*Temporal Specific Fields - Period Definition */
        [Valid From] datetime2 GENERATED ALWAYS AS ROW START HIDDEN NOT NULL,
        [Valid Till] datetime2 GENERATED ALWAYS AS ROW END HIDDEN NOT NULL,
        PERIOD FOR SYSTEM_TIME ([Valid From] ,[Valid Till])
    )
    WITH
    /* Temporal Specific - System-Versioning Configuration*/
    (
        SYSTEM_VERSIONING = ON
        (HISTORY_TABLE = dbo.tbl_Product_History, DATA_CONSISTENCY_CHECK = ON)
    );
    GO
    

    执行insert

    之前说过,当你对一个temporal table执行insert语句,不会影响history table。下面我们执行insert,然后看看相应的结果。

    USE SampleDB
    GO
    INSERT INTO dbo.tbl_Product VALUES
     (1,'Product A', 300)
    ,(2,'Product B', 400)
    GO
     
    SELECT * FROM tbl_Product
    GO
    SELECT * FROM dbo.tbl_Product_History
    GO
    

    执行update

    当你对一个temporal table执行update语句,老数据会被移到history table中,temporal table会保存最新的数据。下面我们执行update,然后看看相应的结果。

    USE SampleDB
    GO
    UPDATE tbl_Product SET Rate =Rate/2
    WHERE Product_ID IN (1,2)
    GO
     
    SELECT * FROM tbl_Product
    GO
    SELECT * FROM dbo.tbl_Product_History
    GO
    

    执行delete

    当你对一个temporal table执行delete语句,老数据会被移到history table中,temporal table会保存最新的数据。下面我们执行delete,然后看看相应的结果。

    USE SampleDB
    GO
    DELETE FROM tbl_Product WHERE Product_ID = 2
    GO
     
    SELECT * FROM tbl_Product
    GO
    SELECT * FROM dbo.tbl_Product_History
    GO
    

    执行select

    在temporal table中执行select非常有意思。

    下面的脚本和正常的table一样返回table最新的结果集:

    USE SampleDB
    GO
    --Current State of the table
    SELECT * FROM tbl_Product
    GO
    

    下面使用 FOR SYSTEM_TIME ‘2015-06-27 21:33:50.9002439’来查询temporal table,这将返回这个表在‘2015-06-27 21:33:50.9002439’ 时的状态。

    USE SampleDB
    GO
    SELECT * FROM tbl_Product
    FOR SYSTEM_TIME AS OF '2015-06-27 21:33:50.9002439'
    GO
    

    下面使用FOR SYSTEM_TIME at ‘2015-06-27 21:43:31.2982847’来查询temporal table,这将返回这个表在‘2015-06-27 21:43:31.2982847’时的状态。

    USE SampleDB
    GO
    SELECT * FROM tbl_Product
    FOR SYSTEM_TIME AS OF '2015-06-27 21:43:31.2982847'
    GO
    

    总结

    有了temporal table,将改变我们为数据仓库设计数据库的方式。因为我们不需要创建一个独立的audit表通过触发器或者存储过程记录数据的变化,temporal table自动为我们完成了这些工作。

  • 相关阅读:
    深度学习训练模型时保存Log输出信息为文件
    Docker 测试场景领域应用剖析
    kafka性能测试
    [标点符] 初学机器学习算法之LightGBM (直方图+单边梯度采样优化+互斥特征绑定优化)
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    【12月DW打卡】joyful-pandas
    Linux安装Redis
  • 原文地址:https://www.cnblogs.com/irocker/p/sql-server-2016-temporal-tables.html
Copyright © 2011-2022 走看看