Обновляемые таблицы реестра

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

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

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

Diagram that shows ledger table architecture.

Чтобы создать обновляемую таблицу реестра, укажите аргумент LEDGER = ON в инструкции CREATE DATABASE (Transact-SQL).

Совет

LEDGER = ON не является при создании обновляемых таблиц реестра в базе данных реестра. По умолчанию каждая таблица является обновляемой таблицей реестра в базе данных реестра.

Сведения о параметрах, доступных при использовании аргумента LEDGER в инструкции T-SQL, см. в статье CREATE TABLE (Transact-SQL).

Важно!

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

Схема обновляемой таблицы реестра

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

Если не указать обязательные столбцы GENERATED ALWAYS таблицы реестра и таблицы журнала реестра в инструкции CREATE TABLE (Transact-SQL), система автоматически добавит столбцы и будет использовать следующие имена по умолчанию. Дополнительные сведения см. в примерах в статье Создание обновляемой таблицы реестра.

Имя столбца по умолчанию Тип данных Description
ledger_start_transaction_id bigint Идентификатор транзакции, при выполнении которой была создана версия строки
ledger_end_transaction_id bigint Идентификатор транзакции, при выполнении которой была удалена версия строки
ledger_start_sequence_number bigint Порядковый номер операции в транзакции, при выполнении которой была создана версия строки
ledger_end_sequence_number bigint Порядковый номер операции в транзакции, при выполнении которой была удалена версия строки

Таблица журнала

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

При создании обновляемой таблицы реестра можно указать имя схемы, которая будет содержать таблицу журнала, и имя таблицы журнала или можно задать генерирование имени таблицы журнала в системе и добавить его в ту же схему, которая используется таблицей реестра. Таблицы журнала с именами, сгенерированными системой, называются анонимными таблицами журнала. Соглашение об именовании для анонимной таблицы журнала: <schema>.<updatableledgertablename>.MSSQL_LedgerHistoryFor_<GUID>.

Представление реестра

Для каждой обновляемой таблицы реестра система автоматически генерирует представление, называемое представлением реестра. Представление реестра представляет собой комбинацию обновляемой таблицы реестра и связанной с ней таблицы журнала. Представление реестра сообщает обо всех изменениях строк, которые появились в обновляемой таблице реестра, путем объединения данных журнала в таблице журнала. Это представление позволяет пользователям, их партнерам или аудиторам анализировать все операции за прошедший период и обнаруживать несанкционированные изменения. Каждая операция строки сопровождается идентификатором действующей транзакции, а также указанием того, была эта операция DELETE или INSERT. Пользователи могут получить дополнительную информацию о времени выполнения транзакции, удостоверении пользователя, который ее выполнил, и сопоставить ее с другими операциями, выполняемыми во время этой транзакции.

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

Пример использования представления реестра см. в статье Создание и использование обновляемых таблиц реестра.

Схема представления реестра отражает столбцы, определенные в обновляемом реестре и таблице журнала, но столбцы GENERATED ALWAYS отличаются от столбцов обновляемого реестра и таблиц журнала.

Схема представления реестра

Примечание.

Имена столбцов представления реестра можно настроить при создании таблицы с использованием параметра <ledger_view_option> в инструкции CREATE TABLE (Transact-SQL). Дополнительные сведения см. в статье о параметрах представления реестра, а соответствующие примеры приведены в CREATE TABLE (Transact-SQL).

Имя столбца по умолчанию Тип данных Description
ledger_transaction_id bigint Идентификатор транзакции, при выполнении которой была создана или удалена версия строки.
ledger_sequence_number bigint Порядковый номер операции на уровне строки в пределах транзакции в таблице.
ledger_operation_type tinyint Содержит 1 (INSERT) или 2 (DELETE). При вставке строки в таблицу реестра учета создается новая строка в представлении реестра, содержащая 1 в этом столбце. При удалении строки из таблицы реестра в представлении книги реестра создается новая строка, содержащая 2 в этом столбце. При обновлении строки в таблице реестра в представлении реестра появляются две новые строки. Одна строка содержит 2 (DELETE), а другая — 1 (INSERT) в этом столбце.
ledger_operation_type_desc NVARCHAR(128) Содержит INSERT или DELETE. Дополнительные сведения см. в предыдущей строке.