Попытка понять некоторые функции отслеживания изменений SQL Server - PullRequest
0 голосов
/ 07 сентября 2018

Я работаю над SQL Server 2016 с пакетом обновления 1 (SP1) с функцией отслеживания изменений, и у меня есть вопрос к вам.

У меня есть база данных, в которой включено отслеживание изменений. Эта база данных содержит таблицу Table, в которой активирована функция «Отслеживание изменений», но не включена опция «Отслеживать обновленные столбцы».

Например, на Table у меня есть только один столбец с именем Id типа «uniqueidentifier», который является моим PK.

При запуске моя текущая версия отслеживания изменений - 0.

Я получил это с:

SELECT CHANGE_TRACKING_CURRENT_VERSION();

Я добавил новую строку в Table:

INSERT INTO dbo.[Table] (Id) 
VALUES ('C99F9E2A-1974-47CE-A406-481076F53BBD');

Теперь моя текущая версия отслеживания изменений - 1.

По этому запросу я вижу свой элемент в системе отслеживания изменений:

SELECT * 
FROM CHANGETABLE (CHANGES dbo.[Table], 0) CT;

Результат:

result 1

Теперь я удаляю свою строку следующим образом:

DELETE FROM dbo.[Table] 
WHERE Id = 'C99F9E2A-1974-47CE-A406-481076F53BBD';

Отслеживание изменений текущей версии теперь 2.

Я вставляю его снова с тем же запросом, что и предыдущий.

Изменение отслеживания текущей версии сейчас 3.

С этим запросом я получил такой результат:

SELECT * 
FROM CHANGETABLE (CHANGES dbo.[Table], 1) CT;

enter image description here

Теперь мой вопрос, почему я получил "U" в SYS_CHANGE_OPERATION?

Почему бы "I" не вызвать 1

Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 07 сентября 2018

Добавляя некоторую мотивацию, цель функций отслеживания изменений состоит в том, чтобы вы могли видеть, что изменилось с момента последней проверки, и позволяют собирать и применять эти изменения к какой-либо другой таблице или внешняя система.

Если вы посмотрите на изменения с сразу после удаления, вы увидите операцию как I. Но если вы посмотрите на изменение еще до удаления, вы «пропустите» удаление. Но отслеживание изменений не помнит, какие неключевые значения были до удаления. Таким образом, сообщается, что строка обновлена.

EG

ALTER DATABASE current  
SET CHANGE_TRACKING = ON  
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)  
go
drop table if exists ct

create table ct(id uniqueidentifier primary key)

ALTER TABLE ct
ENABLE CHANGE_TRACKING  
WITH (TRACK_COLUMNS_UPDATED = ON) 

declare @beforeInsert bigint = (SELECT CHANGE_TRACKING_CURRENT_VERSION());
INSERT INTO dbo.ct (Id) VALUES ('C99F9E2A-1974-47CE-A406-481076F53BBD');
declare @afterInsert bigint = (SELECT CHANGE_TRACKING_CURRENT_VERSION());
DELETE FROM dbo.ct WHERE Id = 'C99F9E2A-1974-47CE-A406-481076F53BBD';
declare @afterDelete bigint = (SELECT CHANGE_TRACKING_CURRENT_VERSION());
INSERT INTO dbo.ct (Id) VALUES ('C99F9E2A-1974-47CE-A406-481076F53BBD');


SELECT 'from before insert to current',id, sys_change_operation FROM CHANGETABLE (CHANGES dbo.ct, @beforeInsert) CT
union all
SELECT 'from after insert to current',id, sys_change_operation FROM CHANGETABLE (CHANGES dbo.ct, @afterInsert) CT
union all
SELECT 'from after delete to current',id, sys_change_operation FROM CHANGETABLE (CHANGES dbo.ct, @afterDelete) CT

выходы

                              id                                   sys_change_operation
----------------------------- ------------------------------------ --------------------
from before insert to current C99F9E2A-1974-47CE-A406-481076F53BBD I
from after insert to current  C99F9E2A-1974-47CE-A406-481076F53BBD U
from after delete to current  C99F9E2A-1974-47CE-A406-481076F53BBD I
0 голосов
/ 07 сентября 2018

С Microsoft Docs CHANGETABLE

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

Предположительно, id является первичным ключом рассматриваемой таблицы.

Кроме того, не используйте id в качестве имени столбца, используйте TableID ... поэтому, если имя таблицы Users, то первичный ключ (если используется суррогатный ключ)должно быть UserID.Использование id в качестве имени столбца первичного ключа приводит к значительной путанице и делает ваш код подверженным ошибкам.Посмотрите на этот ответ для подробностей об этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...