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

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

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

Дополнительные сведения, см. в статье Таблицы реестра только для добавления данных.

Необходимые компоненты

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

Мы создадим таблицу KeyCardEvents по следующей схеме.

Имя столбца Тип данных Description
EmployeeID INT Уникальный идентификатор сотрудника, который входит в здание.
AccessOperationDescription nvarchar(MAX) Операция доступа для сотрудника.
Метка времени datetime2 Дата и время получения сотрудником доступа в здание
  1. С помощью SQL Server Management Studio или Azure Data Studio создайте новую схему и таблицу с именем [AccessControl].[KeyCardEvents].

    CREATE SCHEMA [AccessControl];
    GO
    CREATE TABLE [AccessControl].[KeyCardEvents]
       (
          [EmployeeID] INT NOT NULL,
          [AccessOperationDescription] NVARCHAR (1024) NOT NULL,
          [Timestamp] Datetime2 NOT NULL
       )
       WITH (LEDGER = ON (APPEND_ONLY = ON));
    
  2. Добавьте в таблицу [AccessControl].[KeyCardEvents] новое событие входа в здание со следующими значениями.

    INSERT INTO [AccessControl].[KeyCardEvents]
    VALUES ('43869', 'Building42', '2020-05-02T19:58:47.1234567');
    
  3. Просмотрите содержимое таблицы KeyCardEvents, указав столбцы GENERATED ALWAYS, добавленные в таблицу реестра только для добавления данных.

    SELECT *
         ,[ledger_start_transaction_id]
         ,[ledger_start_sequence_number]
    FROM [AccessControl].[KeyCardEvents];
    

    Screenshot that shows results from querying the KeyCardEvents table.

  4. Просмотрите содержимое представления реестра KeyCardEvents вместе с системным представлением транзакций реестра, чтобы определить, кто добавил записи в таблицу.

     SELECT
     t.[commit_time] AS [CommitTime] 
     , t.[principal_name] AS [UserName]
     , l.[EmployeeID]
     , l.[AccessOperationDescription]
     , l.[Timestamp]
     , l.[ledger_operation_type_desc] AS Operation
     FROM [AccessControl].[KeyCardEvents_Ledger] l
     JOIN sys.database_ledger_transactions t
     ON t.transaction_id = l.ledger_transaction_id
     ORDER BY t.commit_time DESC;
    
  5. Попытайтесь обновить таблицу KeyCardEvents, изменив EmployeeID с 43869 на 34184.

    UPDATE [AccessControl].[KeyCardEvents] SET [EmployeeID] = 34184;
    

    Отобразится ошибка с сообщением о том, что обновления таблицы реестра только для добавления данных не разрешены.

    Screenshot that shows the append-only error message.

Разрешения

Для создания таблиц реестра только для добавления требуется ENABLE LEDGER разрешение. Подробные сведения о разрешениях, связанных с таблицами реестра, см. в разделе Разрешения.