Создание и использование таблиц реестра только для добавления данных
Область применения: SQL Server 2022 (16.x) База данных SQL Azure Управляемый экземпляр SQL Azure
В этой статье показано, как создать таблицу реестра только для добавления. После этого вы вставите значения в таблицу реестра только для добавления и попробуете внести изменения в эти данные. Наконец, можно просмотреть результаты с помощью представления реестра. Мы будем использовать пример системы доступа к объекту с помощью ключ-карты, то есть реализуем шаблон системы только для добавления данных. Наш пример поможет практически представить связи между таблицей реестра только для добавления данных и соответствующим представлением реестра.
Дополнительные сведения, см. в статье Таблицы реестра только для добавления данных.
Необходимые компоненты
Создание таблиц реестра только для добавления данных
Мы создадим таблицу KeyCardEvents
по следующей схеме.
Имя столбца | Тип данных | Description |
---|---|---|
EmployeeID | INT | Уникальный идентификатор сотрудника, который входит в здание. |
AccessOperationDescription | nvarchar(MAX) | Операция доступа для сотрудника. |
Метка времени | datetime2 | Дата и время получения сотрудником доступа в здание |
С помощью 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));
Добавьте в таблицу
[AccessControl].[KeyCardEvents]
новое событие входа в здание со следующими значениями.INSERT INTO [AccessControl].[KeyCardEvents] VALUES ('43869', 'Building42', '2020-05-02T19:58:47.1234567');
Просмотрите содержимое таблицы KeyCardEvents, указав столбцы GENERATED ALWAYS, добавленные в таблицу реестра только для добавления данных.
SELECT * ,[ledger_start_transaction_id] ,[ledger_start_sequence_number] FROM [AccessControl].[KeyCardEvents];
Просмотрите содержимое представления реестра 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;
Попытайтесь обновить таблицу
KeyCardEvents
, изменивEmployeeID
с43869
на34184.
UPDATE [AccessControl].[KeyCardEvents] SET [EmployeeID] = 34184;
Отобразится ошибка с сообщением о том, что обновления таблицы реестра только для добавления данных не разрешены.
Разрешения
Для создания таблиц реестра только для добавления требуется ENABLE LEDGER
разрешение. Подробные сведения о разрешениях, связанных с таблицами реестра, см. в разделе Разрешения.