Управление отслеживанием изменений (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'