Таблицы реестра только для добавления данных
Область применения: 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 . Дополнительные сведения см. в предыдущей строке. |