CHANGE TRACKING CURRENT VERSION: примеры (SQL)

Функция CHANGE_TRACKING_CURRENT_VERSION в SQL Server - примеры и описание
Раздел: Функции разностного отслеживания изменений (Change Tracking)
CHANGE_TRACKING_CURRENT_VERSION: bigint

Описание функции CHANGE_TRACKING_CURRENT_VERSION

Функция CHANGE_TRACKING_CURRENT_VERSION в MS SQL Server предназначена для получения последней версии изменений в рамках механизма отслеживания изменений (Change Tracking) на уровне всей базы данных. Механизм позволяет получать информацию об изменениях в таблицах без использования триггеров или полного сканирования.

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

Синтаксис: CHANGE_TRACKING_CURRENT_VERSION()

Возвращаемое значение: Тип данных bigint. Функция возвращает:

  • Текущий глобальный номер версии изменений в базе данных.
  • NULL, если отслеживание изменений не активировано для базы данных.

Аргументы: Функция не имеет параметров.

Простые примеры использования

Получение текущей версии изменений для всей базы данных.

SELECT CHANGE_TRACKING_CURRENT_VERSION() AS current_version;
current_version
----------------
12345

Проверка активации отслеживания изменений в базе.

SELECT 
    CHANGE_TRACKING_CURRENT_VERSION() AS current_version,
    CASE 
        WHEN CHANGE_TRACKING_CURRENT_VERSION() IS NULL 
        THEN 'Change Tracking is disabled' 
        ELSE 'Change Tracking is enabled' 
    END AS status;
current_version  status
---------------- ---------------------
NULL            Change Tracking is disabled

Похожие функции в MS SQL Server

CHANGE_TRACKING_MIN_VALID_VERSION(table_object_id): Возвращает минимальную допустимую версию для запроса изменений из конкретной таблицы. Используется для проверки срока хранения данных об изменениях.

CHANGETABLE(CHANGES ...): Основная функция для непосредственного получения списка изменений из таблицы. Используется вместе с CHANGE_TRACKING_CURRENT_VERSION для инкрементальной выборки.

Предпочтения: CHANGE_TRACKING_CURRENT_VERSION служит точкой отсчета или контрольной точкой. CHANGE_TRACKING_MIN_VALID_VERSION помогает избежать ошибок из-за очистки старых данных. CHANGETABLE применяется для извлечения самих изменений между версиями.

Аналоги в других СУБД и языках

PostgreSQL (Логическая репликация): Используется идентификатор последней подтвержденной транзакции LSN (Log Sequence Number).

SELECT pg_current_wal_lsn();
pg_current_wal_lsn
------------------
0/15E8E10

Oracle (ORA_ROWSCN): Псевдостолбец, содержащий примерный SCN (System Change Number) последнего изменения в строке.

SELECT ORA_ROWSCN, id FROM my_table WHERE id = 1;
ORA_ROWSCN   ID
---------- ----
   1234567    1

MySQL (Бинарные логи): Аналогом можно считать позицию в бинарном логе.

SHOW MASTER STATUS;
File          Position
------------ ---------
binlog.000003      1234

В отличие от MS SQL, эти механизмы часто требуют более сложной настройки и не предоставляют такой же высокоуровневый абстрактный номер версии, ориентированный именно на изменения данных.

Типичные ошибки и проблемы

Использование функции при отключенном отслеживании изменений возвращает NULL, что может привести к неожиданным результатам в логике приложения.

-- Если Change Tracking не включен
DECLARE @last_version bigint = CHANGE_TRACKING_CURRENT_VERSION();
-- @last_version будет NULL, а не 0
SELECT * FROM CHANGETABLE(CHANGES MyTable, @last_version) AS CT; -- Может вызвать путаницу

Сравнение версии с NULL без должной обработки.

-- Небезопасно
IF (@last_version > @previous_version) -- Если @last_version NULL, условие не сработает
BEGIN
    -- Действия
END

-- Безопасно с обработкой NULL
IF (ISNULL(@last_version, 0) > ISNULL(@previous_version, 0))
BEGIN
    -- Действия
END

Изменения в последних версиях SQL Server

С момента своего появления в SQL Server 2008, функция CHANGE_TRACKING_CURRENT_VERSION не претерпела значительных синтаксических изменений или изменений поведения. Основные улучшения связаны с общей производительностью и надежностью механизма Change Tracking в таких версиях, как SQL Server 2016, 2019 и 2022.

Рекомендуется использовать последние доступные накопительные обновления для оптимальной работы функции и всего компонента отслеживания изменений.

Расширенные сценарии применения

Реализация паттерна инкрементальной загрузки с проверкой срока хранения истории изменений.

Пример sql
DECLARE @current_version bigint;
DECLARE @last_sync_version bigint = 100; -- Версия предыдущей синхронизации
DECLARE @min_valid_version bigint;

-- Получаем текущую и минимальную версию для таблицы
SET @current_version = CHANGE_TRACKING_CURRENT_VERSION();
SET @min_valid_version = CHANGE_TRACKING_MIN_VALID_VERSION(OBJECT_ID('dbo.Orders'));

-- Проверяем, не очищена ли история
IF (@last_sync_version < @min_valid_version)
BEGIN
    RAISERROR('История изменений устарела, требуется полная синхронизация.', 16, 1);
    RETURN;
END

-- Получаем изменения
SELECT 
    CT.*, O.* 
FROM 
    CHANGETABLE(CHANGES dbo.Orders, @last_sync_version) AS CT
    LEFT JOIN dbo.Orders AS O ON CT.id = O.id
WHERE 
    CT.SYS_CHANGE_VERSION <= @current_version;
SYS_CHANGE_VERSION SYS_CHANGE_OPERATION id ... (остальные данные)

Использование в рамках транзакции для согласованного снапшота версии.

Пример sql
BEGIN TRANSACTION;

-- Выполняем некоторые изменения
UPDATE dbo.Products SET Price = Price * 1.1 WHERE CategoryId = 5;

-- Получаем версию, которая будет включать текущие изменения после COMMIT
DECLARE @version_after_changes bigint = CHANGE_TRACKING_CURRENT_VERSION();

COMMIT TRANSACTION;
-- Теперь @version_after_changes можно безопасно использовать для следующей синхронизации

Мониторинг активности изменений в системе.

Пример sql
-- Запрос для отслеживания роста версии с течением времени
SELECT 
    GETDATE() AS sample_time,
    CHANGE_TRACKING_CURRENT_VERSION() AS current_ct_version,
    CHANGE_TRACKING_CURRENT_VERSION() - LAG(CHANGE_TRACKING_CURRENT_VERSION()) OVER (ORDER BY sample_time) AS version_increment
INTO #version_monitor
-- Запускать периодически по расписанию

MS SQL CHANGE_TRACKING_CURRENT_VERSION function comments

En
CHANGE TRACKING CURRENT VERSION Gets a version number associated with the last committed transaction