SQL Server - темпоральная таблица - только выбранные столбцы

Одним из требований недавнего проекта, над которым я работал, было ведение истории данных таблицы базы данных как часть контрольного журнала. Моя первая мысль о техническом решении заключалась в использовании триггеров, но после некоторых исследований я узнал о темпоральных таблицах SQL Server (часть ядра SQL Server 2016). Я провел много исследований по этому поводу и убедился, что временные таблицы могут найти хорошее применение.

Подробнее о темпоральных таблицах: Управление временными История таблиц в SQL Server 2016

Однако я хочу, чтобы данные в темпоральных таблицах создавались только при изменении нескольких столбцов.

CREATE TABLE dbo.Persons
(
  ID BIGINT IDENTITY(1,1) NOT NULL,
  FirstName NVARCHAR(50) NOT NULL,
  LastName NVARCHAR(50),
  PhoneNumber NVARCHAR(20)
)

Теперь, если я создам временную таблицу поверх нее (SYSTEM_VERSIONING = On), я хочу, чтобы данные вставлялись в временную таблицу только при изменении номера телефона, а не имени и фамилии.


person Anand    schedule 25.09.2018    source источник


Ответы (2)


К сожалению, это не так. Как говорится в ссылке в вашем сообщении, «управление версиями системы - это все или ничего». Честно говоря, ваш первый инстинкт, вероятно, ваш лучший вариант - любой другой способ сделать это (CDC, репликация, управление версиями системы ...) захватит больше данных, чем вы хотите, и вам придется сократить результаты постфактум.

Если вы действительно хотите использовать управление версиями системы, вам просто нужно использовать один из вариантов, представленных в предоставленной ссылке: удалить ненужные строки и / или обновить нежелательные столбцы до значений NULL.

Я бы рекомендовал руководствоваться вашим первым инстинктом и использовать триггеры для реализации чего-то вроде медленно меняющегося измерения типа 4. Это самый простой способ получить нужные вам данные.

person GreyOrGray    schedule 25.09.2018
comment
Спасибо IsItGreyOrGray. Это помогает, я бы хотел, чтобы в SQL были более интегрированные способы сделать это. - person Anand; 26.10.2018

Вы можете создать одну таблицу для атрибутов, для которых вы хотите вести историю (и вы установите system_versioning = ON), и вторую таблицу с атрибутами, для которых вам не нужна история. Между двумя таблицами у вас будет отношение 1 к 1.

person IanaR    schedule 26.04.2021
comment
Между двумя таблицами у вас будет отношение 1 к 1. - это добавляет сложности, потому что SQL Server не поддерживает отношения true 1:1 (по крайней мере, без взрыва таблицы внешнего ключа), потому что он не поддерживает откладываемые ограничения. Ворчать. - person Dai; 14.07.2021
comment
Чтобы уточнить мой комментарий, один из способов принудительного применения 1:1 ограничений (между LeftHalf и RightHalf) состоит в том, чтобы иметь CREATE TABLE LeftHalf ( WholeId int IDENTITY PRIMARY KEY ), CREATE TABLE RightHalf( WholeId int PRIMARY KEY, FOREIGN KEY LeftHalf ( WholeId ) ), CREATE TABLE Wholes ( LeftHalfId int NOT NULL FOREIGN KEY LeftHalf ( WholeId ), RightHalfId int NOT NULL FOREIGN KEY RightHalf ( WholeId ), PRIMARY KEY ( LeftHalfId, RightHalfId ) ), а затем использовать Wholes таблицу как основную - и, как вы можете видеть, это быстро превращается в беспорядок. - person Dai; 14.07.2021