Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Platí pro: SQL Server 2022 (16.x) a novější verze
Azure SQL Database
Azure 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.
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 vaše databáze nakonfigurovaná pro automatické úložiště souhrnů databáze, přibližně každých 30 sekund
- Když uživatel ručně vygeneruje souhrn databáze spuštěním uložené procedury sys.sp_generate_database_ledger_digest
- Když obsahuje 100 tisíc transakcí.
Když je blok uzavřen, budou nové transakce vloženy do nového bloku. Proces generování bloků pak:
- 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.
- Vypočítá kořen stromu Merkle přes tyto transakce a hodnotu hash předchozího bloku.
- 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.
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:
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í.