SQL Server 2016: Temporal Tables (часть 3)

By | June 27, 2015

Мы уже разобрались как создавать temporal table и как из обычной таблицы сделать temporal table. В этой статье мы рассмотрим как получить системную информацию о temporal table и какие ограничение есть при работе с этими таблицами.

У таблиц появились свойства temporal_type, temporal_type_desc, history_table_id. Создайте обычную таблицу с именем dbo.Test и рассмотрим, что они хранят на основе результатов работы запросов:

SELECT object_id, temporal_type, temporal_type_desc, history_table_id, name FROM SYS.TABLES
WHERE object_id = OBJECT_ID(‘dbo.Products’, ‘U’)
SELECT object_id, temporal_type, temporal_type_desc, history_table_id, name FROM SYS.TABLES
WHERE object_id OBJECT_ID(‘dbo.ProductsHistory’, ‘U’)
SELECT object_id, temporal_type, temporal_type_desc, history_table_id, name FROM SYS.TABLES
WHERE object_id OBJECT_ID(‘dbo.test’, ‘U’)

Я думаю здесь всё очевидно. Кстати, если вы хотите использовать функцию OBJECTPROPERTY, то temporal_type надо заменить на TableTemporalType:

SELECT OBJECTPROPERTY(object_id(‘dbo.Products’),‘TableTemporalType’)                    

Теперь поговорим об ограничениях: 

  • историческая таблица не может иметь ограничения (PK, FK, Table и Column constraints)
  • операции INSERT и UPDATE не могут в явном виде обращаться к колонкам указанным в SYSTEM_TIME
  • операция TRUNCATE TABLE равно как и операции DDL
    не поддерживаются если свойство SYSTEM_VERSIONING имеет значение ON. Для операций DDL исключение составляют ALTER TABLE…REBUILD, CREATE INDEX, CREATE STATISTICS
  • нельзя напрямую изменять данные в исторической таблице
  • INSTEAD OF триггеры не поддерживаются на обеих таблицах

Кроме того, если при включении свойства SYSTEM_VERSIONING происходит проверка на выполнение следующих условий:

  1. Число колонок совпадает в базовой и исторической таблицах
  2. Типы данных для каждой из колонок совпадает в обеих таблицах
  3. Колонки для хранения информации об актуальности строки имеют свойство NOT NULL
  4. Базовая таблица имеет первичный ключ, а историческая таблица наоборот не имеет такого ключа
  5. В исторической таблице нет колонки со свойством IDENTITY
  6. В исторической таблице нет триггеров
  7. Если в базовой таблице есть колонки, помеченные как HIDDEN, то и в исторической таблице они имеют такое же свойство
  8. В исторической таблице нет внешних ключей
  9. В исторической таблице нет ограничений за исключением значений по умолчанию
  10. Историческая таблица не находится в файловой группе для чтения
  11. Историческая таблица не сконфигурирована для использования в change tracking и change data capture
  12. Выполняется условие SysEndTime ≥SysStartTime

Обновление от 06.07.2015: Рекомендую отличную статью “First Look at System-Versioned Temporal Tables-Part 2: Querying Data and Optimization Considerations” от

 

2 thoughts on “SQL Server 2016: Temporal Tables (часть 3)

  1. Pingback: SQL Server 2016: Temporal tables | Korshikov's

  2. Pingback: SQL Server 2016. Знакомимся с новинками | Korshikov's

Comments are closed.