データベース台帳とは
適用対象: SQL Server 2022 (16.x)
Azure SQL データベース
Azure SQL Managed Instance
データベース台帳は、台帳機能の一部です。 データベース台帳では、時間と共に変化するデータベースの状態を差分によって把握しつつ、台帳テーブルを更新します。 ブロックチェーンとマークル ツリーのデータ構造を論理的に使用します。
台帳テーブルを更新する操作では、履歴データを維持し、データベース台帳でキャプチャされたダイジェストを計算するために、いくつかの追加のタスクを実行する必要があります。 具体的には、更新されたすべての行について、次の操作を行う必要があります。
- 履歴テーブル内の行の以前のバージョンを維持します。
- トランザクション ID を割り当て、新しいシーケンス番号を生成して、適切なシステム列に保持します。
- 行の内容をシリアル化し、このトランザクションによって更新されたすべての行のハッシュを計算するときに、それを含めます。
台帳は、台帳テーブルを対象とするすべての挿入、更新、削除の操作の データ操作言語 (DML) クエリ プランを拡張することで、これを実現します。 トランザクション ID と、新しく生成されたシーケンス番号は、新しいバージョンの行に対して設定されます。 次に、クエリ プラン演算子によって、行の内容をシリアル化してそのハッシュを計算する特殊な式が実行されます。また、これは、トランザクション レベルで格納され、かつこの台帳テーブルに対してこのトランザクションによって更新されたすべての行バージョンのハッシュを含む Merkle ツリーに追加されます。 ツリーのルートは、この台帳テーブルでこのトランザクションによって実行されたすべての更新と削除を表します。 トランザクションによって複数のテーブルが更新されると、各テーブルに対して個別の Merkle ツリーが保持されます。 次の図は、更新された行バージョンの台帳テーブルを格納する Merkle ツリーの例と、行のシリアル化に使用される形式を示しています。 各列のシリアル化された値以外には、行内の列の数、個々の列の序数、データ型、長さ、および値の解釈方法に影響を与えるその他の情報に関するメタデータが含まれます。
データベースの状態を把握するため、データベース台帳には、すべてのトランザクションのエントリを保存します。 コミットのタイムスタンプやそれを実行したユーザーの ID など、トランザクションのメタデータも保存します。 各台帳テーブル内の更新された行の Merkle ツリー ルートもキャプチャします (上記を参照)。 これらのエントリは、将来整合性を検証するために、開封明示のデータ構造に追加されます。 ブロックは、次の場合に閉じられます。
- 自動データベース ダイジェスト ストレージに対してデータベースが構成される場合 (約 30 秒ごと)
- ユーザーが、sys.sp_generate_database_ledger_digest ストアド プロシージャを実行して、データベース ダイジェストを手動で生成する場合
- 100,000 件のトランザクションが含まれている場合。
ブロックが閉じられると、新しいトランザクションが新しいブロックに挿入されます。 それ以降のブロック生成プロセスは、次のようになります。
- 閉じた ブロックに属するすべてのトランザクションを、メモリ内のキューと sys.database_ledger_transactions システム カタログ ビューの両方から取得します。
- これらのトランザクションのマークル ツリーのルートと、直前のブロックのハッシュを計算します。
- 閉じたブロックを sys.database_ledger_blocks システム カタログ ビューに保存します。
このテーブル更新は定期的に実行され、システムの持続性が自動的に保証されます。 ブロックのチェーン 1 本を管理するのに、この操作がシングル スレッドで実行されます。 ただし、トランザクション情報に関わるハッシュだけを計算すればよく、非同期で実行することから、これは効率的なやり方であるといえます。 トランザクションのパフォーマンスには影響がありません。
台帳を使用してデータの整合性を実現する方法に関する詳細については、ダイジェスト管理とデータベースの検証に関する記事を参照してください。
データベース トランザクションとブロック データはどこに保存されますか?
トランザクションとブロックのデータは、 次の 2 つのシステム カタログ ビューの行に物理的に保存します。
- sys.database_ledger_transactions: データベース台帳での各トランザクションの情報を含む行を管理します。 その情報には、このトランザクションが属するブロックの ID や、このトランザクションのブロック内での序数が含まれます。
- sys.database_ledger_blocks: 台帳のすべてのブロックに対応する行を管理します。ブロック内のトランザクションのマークル ツリーのルートや、ブロックチェーン形成のための直前のブロックのハッシュなどの情報を含みます。
データベース レジャーを表示するには、SQL Server Management Studio、Azure Data Studio、SQL Server Developer Tools のいずれかで次の T-SQL 文を実行します。
SELECT * FROM sys.database_ledger_transactions;
GO
SELECT * FROM sys.database_ledger_blocks;
GO
次に挙げる台帳テーブルのサンプルは 4 つのトランザクションで構成されています。これらのトランザクションにより、データベース台帳のブロックチェーンのブロック 1 つが構成されます。
アクセス許可
データベース レジャーを表示するには、VIEW LEDGER CONTENT
アクセス許可が必要です。 台帳テーブルに関連するアクセス許可の詳細については、アクセス許可に関するページを参照してください。