Об отслеживании изменений (SQL Server)

Область применения: SQL Server База данных SQL Azure Управляемый экземпляр SQL Azure

В этой статье описывается функция отслеживания изменений для SQL Server, которая представляет собой упрощенное решение, которое предоставляет эффективный механизм отслеживания изменений для приложений.

Чтобы приступить к работе, ознакомьтесь со статьей "Настройка отслеживания изменений".

Обзор

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

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

  • Какие строки изменены в пользовательской таблице?

    • Требуется только факт изменения строки, но не число изменений строки или значения промежуточных изменений.

    • Можно получить последние данные непосредственно из отслеживаемой таблицы.

  • Изменилась ли строка?

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

Примечание.

Если приложению необходимы данные обо всех произведенных изменениях и все промежуточные значения, следует воспользоваться методом записи данных изменений вместо отслеживания изменений. Дополнительные сведения см. в статье об отслеживании измененных данных (SQL Server).

Приложения односторонней и двусторонней синхронизации

Приложения, которым требуется синхронизировать данные с экземпляром ядра СУБД Microsoft SQL Server, должны иметь возможность направлять запрос об изменениях. Отслеживание изменений может послужить основой для односторонней и двусторонней синхронизации приложений.

Приложения односторонней синхронизации

Приложения односторонней синхронизации, такие как клиентское или приложение кэширования промежуточного уровня, можно построить с использованием отслеживания изменений. Как показано на следующем рисунке, приложению кэширования требуется хранить данные в ядро СУБД и кэшироваться в других хранилищах данных. Приложение должно иметь возможность своевременно помещать в кэш любые изменения, внесенные в таблицы базы данных. Нет изменений, которые необходимо передать обратно в ядро СУБД.

Схема: применение односторонней синхронизации.

Приложения двусторонней синхронизации

С помощью отслеживания изменений можно также построить и приложения двусторонней синхронизации. В этом сценарии данные в экземпляре ядро СУБД синхронизируются с одним или несколькими хранилищами данных. Данные в этих хранилищах можно обновить, а изменения должны быть синхронизированы с ядро СУБД.

Схема: применение двусторонней синхронизации.

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

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

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

Чтобы настроить отслеживание изменений, можно использовать инструкции DDL или SQL Server Management Studio. Дополнительные сведения см. в разделе "Включение и отключение Отслеживание изменений". Чтобы разрешить отслеживание изменений, необходимо включить эту функцию сначала на уровне базы данных, а затем для всех таблиц базы данных, изменения в которых необходимо отслеживать. Определение таблицы не должно быть изменено каким-либо образом, и триггеры не создаются.

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

Значения столбца первичного ключа — это единственная информация из отслеживаемой таблицы, записанной с информацией об изменении. Эти значения идентифицируют измененные строки. Приложение может произвести соединение исходной таблицы с отслеживаемой таблицей по значениям первичного ключевого столбца, чтобы извлечь для этих строк новые значения данных.

Сведения об изменении, внесенном в каждую строку, могут быть получены с помощью отслеживания изменений. Например, тип операции DML, который вызвал изменение (вставку, обновление или удаление), или столбцы, измененные в ходе операции обновления.

Все операции DML отслеживаются, даже если значение столбца не изменяется. Например, если инструкция обновления задает столбец тому же значению, что у него уже есть, столбец по-прежнему считается измененным.

Очистка отслеживания изменений

Сведения об отслеживании изменений для всех таблиц (с включенной функцией отслеживания изменений) хранятся в хранилище строк в памяти. Данные отслеживания изменений, связанные с каждой таблицей, включенной для отслеживания изменений, записываются на каждой контрольной точке из хранилища строк в памяти в соответствующую внутреннюю таблицу на диске. Во время контрольной точки хранилище строк в памяти удаляется после перемещения строк в таблицы на диске.

Каждая таблица, включенная для отслеживания изменений, содержит внутреннюю таблицу на диске, которая используется функциями отслеживания изменений для определения версии изменения и строк, измененных после определенной версии. При каждой активации потока автоматической очистки проверяются все пользовательские базы данных на экземпляре SQL Server для определения баз данных с поддержкой отслеживания изменений. На основе параметра срока хранения базы данных каждая внутренняя таблица на диске удаляется из устаревших записей.

Хранимая процедура была добавлена в пакеты обновления для SQL Server 2014 (12.x) и SQL Server 2016 (13.x) для выполнения ручной очистки внутренних Отслеживание изменений внутренних таблиц. Дополнительные сведения о хранимой процедуре см. в статье базы знаний 173157.