Настройка и управление отслеживания изменений

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

Включение отслеживания изменений для базы данных

Прежде чем начать отслеживание изменений, его надо включить на уровне базы данных. В следующем примере показано, как включить отслеживание изменений при помощи инструкции ALTER DATABASE:

ALTER DATABASE AdventureWorks2008R2
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);

Включить отслеживание изменений можно также в среде Среда SQL Server Management Studio, в диалоговом окне Свойства базы данных (страница «Отслеживание изменений»).

При включении отслеживания изменений, а также в любое время в дальнейшем можно указать и изменить значения параметров CHANGE_RETENTION и AUTO_CLEANUP.

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

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

При этом следует учесть следующие моменты.

  • При отслеживании изменений уровень совместимости базы данных должен быть не ниже 90. Если уровень совместимости базы данных менее 90, то можно настроить отслеживание изменений. Однако функция CHANGETABLE, используемая для получения сведений об отслеживании изменений, возвратит ошибку.

  • Простейший способ обеспечения согласованности всех данных отслеживания изменений — изоляция моментальных снимков. По этой причине настоятельно рекомендуется включить для базы данных изоляцию моментальных снимков. Дополнительные сведения см. в разделе Использование отслеживания изменений.

Включение отслеживания изменений для таблицы

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

В следующем примере показано, как настроить отслеживание изменений с помощью инструкции ALTER TABLE.

ALTER TABLE Person.Person
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);

Включить отслеживание изменений можно также в среде Среда SQL Server Management Studio, в диалоговом окне Свойства таблицы (страница «Отслеживание изменений»).

Если параметр TRACK_COLUMNS_UPDATED установлен в значение ON, компонент SQL Server Database Engine сохраняет во внутренней таблице отслеживания дополнительные сведения о столбцах, которые были обновлены. Отслеживание столбцов позволяет приложению синхронизировать только те столбцы, которые были обновлены. Это может повысить эффективность и производительность. Но, поскольку отслеживание столбцов требует дополнительного места на диске, по умолчанию этот параметр отключен.

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

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

В следующем примере показано, как отключить отслеживание изменений с помощью инструкции ALTER TABLE.

ALTER TABLE Person.Person
DISABLE CHANGE_TRACKING;

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

ALTER DATABASE AdventureWorks2008R2
SET CHANGE_TRACKING = OFF;

Управление отслеживанием изменений

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

Представления каталога

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

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

Безопасность

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

  • Разрешение SELECT как минимум для столбцов первичного ключа отслеживаемой таблицы, для которой выполняется запрос.

  • Разрешение VIEW CHANGE TRACKING для таблицы, для которой выполняется получение данных отслеживания изменений. Это разрешение необходимо по следующим причинам.

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

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

Основные сведения о затратах на отслеживание изменений

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

Операция

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

DROP TABLE

Для удаленной таблицы удаляются и все данные отслеживания изменений

ALTER TABLE DROP CONSTRAINT

Попытка удалить ограничение PRIMARY KEY завершится ошибкой. Перед удалением ограничения PRIMARY KEY отслеживание изменений необходимо отключить.

ALTER TABLE DROP COLUMN

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

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

ALTER TABLE ADD COLUMN

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

ALTER TABLE ALTER COLUMN

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

ALTER TABLE SWITCH

Переключение секции завершится ошибкой, если для одной или обеих таблиц включено отслеживание изменений.

DROP INDEX или ALTER INDEX DISABLE

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

TRUNCATE TABLE

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

Использование отслеживания изменений связано с некоторыми дополнительными затратами при операциях DML из-за сведений об отслеживании затрат, сохраняемых в ходе операции.

Влияние на DML

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

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

  • Число столбцов первичного ключа.

  • Объем изменяемых данных в строке пользовательской таблицы.

  • Число операций, производимых в рамках транзакции.

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

Влияние на хранилище данных

Данные отслеживания изменений хранятся во внутренних таблицах следующих типов.

  • Внутренняя таблица изменений

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

  • Внутренняя таблица транзакций

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

Эти внутренние таблицы следующим образом влияют на требования к хранилищу.

  • Каждое изменение в любой из строк пользовательской таблицы приводит к добавлению строки во внутреннюю таблицу изменений. Каждая такая строка занимает небольшое фиксированное пространство плюс размер столбцов первичного ключа. Строка может содержать дополнительные сведения о контексте, задаваемые приложением. Если включено отслеживание изменений столбцов, то каждый измененный столбец занимает 4 байта в таблице отслеживания.

  • Для каждой зафиксированной транзакции во внутреннюю таблицу транзакций добавляется строка.

Как для других внутренних таблиц, место, занимаемое таблицами отслеживания изменений, можно определить с помощью хранимой процедуры sp_spaceused. Названия внутренних таблиц можно определить с помощью представления каталога sys.internal_tables, как показано в следующем примере.

sp_spaceused 'sys.change_tracking_309576141';
sp_spaceused 'sys.syscommittab';