Поделиться через


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

Применимо к:SQL ServerБаза данных SQL AzureУправляемый экземпляр SQL AzureБаза данных SQL в Microsoft Fabric

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

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

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

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

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

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

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

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

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

  • VIEW CHANGE TRACKING разрешение на таблицу, для которой получены изменения. Разрешение 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, or 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'