追加専用の台帳テーブル

適用対象: SQL Server 2022 (16.x) Azure SQL データベース Azure SQL Managed Instance

追加専用台帳テーブルでは、テーブルに対する INSERT 操作のみを許可し、データベース管理者などの特権ユーザーが従来のデータ操作言語操作でデータを変更することができないように保証されています。 追加専用台帳テーブルは、セキュリティ情報イベント管理システムや、ブロックチェーンからデータベースにデータを複製する必要があるブロックチェーン システムなど、レコードの更新と削除を行わないシステムに最適です。 追加専用テーブルに対する UPDATEDELETE の操作がないため、更新可能な台帳テーブルの場合のように、対応する履歴テーブルは必要ありません。

台帳テーブルのアーキテクチャを示す図。

追加専用台帳テーブルは、CREATE TABLE (Transact-SQL) ステートメントで LEDGER = ON 引数を指定し、APPEND_ONLY = ON オプションを指定して作成できます。

重要

テーブルが台帳テーブルとして作成された後は、台帳機能を持たないテーブルに戻すことはできません。 この結果、攻撃者が台帳機能を一時的に削除し、テーブルに変更を加えてから台帳機能を再び有効にすることはできません。

追加専用の台帳テーブルのスキーマ

追加専用台帳テーブルには、テーブルに変更を加えたトランザクションと、そのトランザクションによって行が更新された操作の順番を示すメタデータを含む、次の GENERATED ALWAYS 列が必要です。 追加専用台帳テーブルを作成すると、台帳テーブルに GENERATED ALWAYS 列が作成されます。 このデータは、データがどのように挿入されたのかを時系列で理解する、フォレンジックの目的に役立ちます。

CREATE TABLE ステートメントで GENERATED ALWAYS 列の定義を指定しない場合、次の既定の名前を使用して自動的に追加されます。

既定の列名 データの種類 説明
ledger_start_transaction_id bigint 行バージョンを作成したトランザクションの ID
ledger_start_sequence_number bigint 行バージョンを作成したトランザクション内の操作のシーケンス番号

台帳ビュー

追加専用のすべての元帳テーブルに対して、台帳ビューと呼ばれるビューが自動的に生成されます。 台帳ビューは、テーブルで発生したすべての行の挿入を報告します。 台帳ビューが主に役立つのは、更新可能な台帳テーブルに対してであり、追加専用台帳テーブルに対してではありません。これは、追加専用台帳テーブルには UPDATEDELETE の機能がないからです。 追加専用の台帳テーブルの台帳ビューでは、更新可能な台帳テーブルと追加専用の台帳テーブルの間で一貫性を保つことができます。

台帳ビューのスキーマ

Note

台帳ビューの列名は、CREATE TABLE (Transact-SQL) ステートメントで <ledger_view_option> パラメーターを使用してテーブルを作成するときにカスタマイズできます。 詳しくは台帳ビューのオプションに関する記事と、CREATE TABLE (Transact-SQL) に関する記事中の対応する例をご覧ください。

既定の列名 データの種類 説明
ledger_transaction_id bigint 行バージョンを作成または削除したトランザクションの ID。
ledger_sequence_number bigint テーブルに対するトランザクション内の行レベルの操作のシーケンス番号。
ledger_operation_type tinyint 1 (INSERT) または 2 (DELETE) を含みます。 台帳テーブルに行を挿入すると、この列に 1 が含まれる新しい行が台帳ビューに生成されます。 台帳テーブルから行を削除すると、この列に 2 が含まれる新しい行が台帳ビューに生成されます。 台帳テーブルの行を更新すると、2 つの新しい行が台帳ビューに生成されます。 一方の行のこの列に 2 (DELETE) が含まれ、もう一方の行のこの列に 1 (INSERT) が含まれます。 追加専用台帳テーブルでは DELETE は実行しないでください。
ledger_operation_type_desc nvarchar(128) INSERT または DELETE が含まれます。 詳細については、前述の行を参照してください。