CHANGE TRACKING CURRENT VERSION: примеры (SQL)
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.
Рекомендуется использовать последние доступные накопительные обновления для оптимальной работы функции и всего компонента отслеживания изменений.
Расширенные сценарии применения
Реализация паттерна инкрементальной загрузки с проверкой срока хранения истории изменений.
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 ... (остальные данные)
Использование в рамках транзакции для согласованного снапшота версии.
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 можно безопасно использовать для следующей синхронизацииМониторинг активности изменений в системе.
-- Запрос для отслеживания роста версии с течением времени
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
- Ms SQL CHANGE TRACKING CURRENT VERSION - аргументы и возвращаемое значение
- Функция sql CHANGE_TRACKING_CURRENT_VERSION - описание
- CHANGE TRACKING CURRENT VERSION - примеры
- CHANGE TRACKING CURRENT VERSION - похожие методы на sql
- CHANGE_TRACKING_CURRENT_VERSION на mySQL, Oracle, PostgreSQL, SQLite
- CHANGE TRACKING CURRENT VERSION изменения sql
- Примеры CHANGE_TRACKING_CURRENT_VERSION на ms SQL