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


Таблицы реестра только для добавления данных

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

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

Схема архитектуры таблиц реестра.

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

Внимание

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

Схема таблицы учета только для добавления

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

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

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

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

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

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

Примечание.

Имена столбцов представления реестра можно настроить при создании таблицы с использованием параметра <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) в этом столбце. В таблице реестра только для добавления строка, содержащая DELETE, не должна появляться.
ledger_operation_type_desc NVARCHAR(128) Содержит INSERT или DELETE. Дополнительные сведения см. в предыдущей строке.