Sdílet prostřednictvím


Co je registr databáze?

Platí pro: SQL Server 2022 (16.x) a novější verze Azure SQL DatabaseAzure SQL Managed Instance

Registr databáze je součástí funkce registru. Registr databáze postupně zachycuje stav databáze, protože se databáze vyvíjí v průběhu času, zatímco aktualizace probíhají u tabulek registru. Logicky používá datové struktury blockchainu a Merkle tree.

Všechny operace, které aktualizují tabulku registru, musí provádět některé další úlohy, aby bylo možné zachovat historická data a vypočítat hodnoty hash zachycené v registru databáze. Konkrétně pro každý aktualizovaný řádek musíme:

  • Zachovají předchozí verzi řádku v tabulce historie.
  • Přiřaďte ID transakce, vygenerujte nové pořadové číslo a následně je uložte do příslušných systémových sloupců.
  • Serializovat obsah řádku a zahrnout jej při výpočtu hodnoty hash pro všechny řádky aktualizované touto transakcí.

Ledger toho dosahuje rozšířením plánů dotazů Data Manipulation Language (DML) pro všechny operace vložení, aktualizace a odstranění, které cílí na tabulky ledgeru. ID transakce a nově vygenerované pořadové číslo jsou nastaveny pro novou verzi řádku. Potom operátor plánu dotazu spustí speciální výraz, který serializuje obsah řádku a vypočítá jeho hash, připojí ho ke stromu Merkle, který je uložen na úrovni transakce a obsahuje hodnoty hash všech verzí řádků aktualizované touto transakcí pro tuto tabulku registru. Kořen stromu představuje všechny aktualizace a odstranění provedené touto transakcí v této tabulce registru. Pokud transakce aktualizuje více tabulek, je pro každou tabulku zachován samostatný Merkle Tree. Následující obrázek ukazuje příklad Merkle Tree, který ukládá aktualizované verze řádků tabulky registru a formát použitý k serializaci řádků. Kromě serializované hodnoty každého sloupce zahrneme metadata týkající se počtu sloupců v řádku, pořadového čísla jednotlivých sloupců, datových typů, délek a dalších informací, které ovlivňují způsob interpretace hodnot.

Diagram znázorňující Merkle Tree, který ukládá aktualizované verze řádků tabulky registru a formát použitý k serializaci řádků

Pokud chcete zaznamenat stav databáze, registru databáze ukládá položku pro každou transakci. Zachycuje metadata o transakci, jako je časové razítko potvrzení a identita uživatele, který ji spustil. Zachytí také kořen merkleového stromu řádků aktualizovaných v každé tabulce registru (viz výše). Tyto položky se pak připojují ke struktuře dat zřejmé z manipulace, aby bylo možné ověřit integritu v budoucnu. Blok je zavřený:

Když je blok uzavřen, budou nové transakce vloženy do nového bloku. Proces generování bloků pak:

  1. Načte všechny transakce, které patří do bloku uzavřeného jak z fronty v paměti, tak ze zobrazení systémového katalogu sys.database_ledger_transactions.
  2. Vypočítá kořen stromu Merkle přes tyto transakce a hodnotu hash předchozího bloku.
  3. Zachová uzavřený blok v zobrazení sys.database_ledger_blocks systémového katalogu.

Vzhledem k tomu, že se jedná o běžnou aktualizaci tabulky, systém automaticky zaručuje jeho stálost. Chcete-li zachovat jeden řetězec bloků, je tato operace jednovláknová. Je ale také efektivní, protože vypočítá pouze hodnoty hash nad informacemi o transakci asynchronně. Nemá vliv na výkon transakce.

Diagram znázorňující Merkle Tree, který ukládá transakce tabulky registru

Další informace o tom, jak účetní kniha poskytuje integritu dat, najdete v článcích správa kontrolních součtů a ověření databáze.

Kde jsou uložené databázové transakce a blokovaná data?

Data pro transakce a bloky jsou fyzicky uložena jako řádky ve dvou zobrazeních systémového katalogu:

  • sys.database_ledger_transactions: Udržuje řádek s informacemi o každé transakci v registru databáze. Informace zahrnují ID bloku, ve kterém tato transakce patří, a pořadové číslo transakce v rámci bloku.
  • sys.database_ledger_blocks: Udržuje řádek pro každý blok v účetní knize, včetně kořene Merkleho stromu nad transakcemi v bloku a hash předchozího bloku tak, aby tvořily blockchain.

Pokud chcete zobrazit registr databáze, spusťte následující příkazy T-SQL v sadě SQL Server Management Studio nebo SQL Server Developer Tools.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

Následující příklad tabulky registru se skládá ze čtyř transakcí, které tvoří jeden blok v blockchainu registru databáze:

Snímek obrazovky s ukázkovou tabulkou registru

Povolení

Zobrazení registru databáze vyžaduje VIEW LEDGER CONTENT oprávnění. Podrobnosti o oprávněních souvisejících s tabulkami registru najdete v tématu Oprávnění.