【问题标题】:How to determine if sql table is Temporal?如何判断 sql 表是否为 Temporal?
【发布时间】:2015-06-29 20:28:27
【问题描述】:

SQL Server 2016 支持Temporal Tables 我想知道是否有办法确定表当前是否是临时表?类似的东西

select * from sys.objects where object_id('dbo.MyTable', 'u') = parent_object_id and type_desc = "SYSTEM_VERSIONED"

【问题讨论】:

    标签: sql sql-server sql-server-2016


    【解决方案1】:
    SELECT temporal_type
    FROM   sys.tables
    WHERE  object_id = OBJECT_ID('dbo.MyTable', 'u') 
    

    0 = NON_TEMPORAL_TABLE

    1 = HISTORY_TABLE

    2 = SYSTEM_VERSIONED_TEMPORAL_TABLE

    Documentation

    【讨论】:

      【解决方案2】:

      在本 SQL 教程中,List Temporal and History Tables in a SQL Server Database 给出了将时态表与其历史表一起列出的另一种方法

      select
       t.object_id,
       t.name,
       t.temporal_type,
       t.temporal_type_desc,
       h.object_id,
       h.name,
       h.temporal_type,
       h.temporal_type_desc
      from sys.tables t
      inner join sys.tables h on t.history_table_id = h.object_id 
      

      【讨论】:

        【解决方案3】:

        这是对原始基本问题的简单回答:

        SELECT *
        FROM sys.tables
        WHERE name = 'MyTable'
            AND schema_id = SCHEMA_ID('dbo')
            AND temporal_type_desc = 'SYSTEM_VERSIONED_TEMPORAL_TABLE'
        

        这是一个类似的查询,用于查找实际的系统管理历史表:

        SELECT h.* FROM sys.tables p 
        INNER JOIN sys.tables h
            ON p.history_table_id = h.object_id
        WHERE p.name = 'MyTable'
            AND p.schema_id = SCHEMA_ID('dbo')
            AND p.temporal_type_desc = 'SYSTEM_VERSIONED_TEMPORAL_TABLE';
        

        【讨论】:

          【解决方案4】:

          此查询将为您提供系统版本表、关联的历史表、保留策略以及是否在数据库级别启用了保留策略。

          From Microsoft Docs

          SELECT DB.is_temporal_history_retention_enabled,
          SCHEMA_NAME(T1.schema_id) AS TemporalTableSchema,
          T1.name as TemporalTableName,  SCHEMA_NAME(T2.schema_id) AS HistoryTableSchema,
          T2.name as HistoryTableName,T1.history_retention_period,
          T1.history_retention_period_unit_desc
          FROM sys.tables T1  
          OUTER APPLY (select is_temporal_history_retention_enabled from sys.databases
          where name = DB_NAME()) AS DB
          LEFT JOIN sys.tables T2   
          ON T1.history_table_id = T2.object_id WHERE T1.temporal_type = 2
          

          【讨论】:

          • 似乎 history_retention_policy 只出现在 SQL 2017 中。例如除非删除保留位,否则上述查询在 SQL 2016 中不起作用。我希望我错了,在 SQL 2016 中我做错了什么???
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-10-31
          • 2016-07-26
          • 2014-04-12
          相关资源
          最近更新 更多