¿Qué es el libro de contabilidad de base de datos?

Se aplica a: SQL Server 2022 (16.x) Azure SQL DatabaseAzure SQL Managed Instance

El libro de contabilidad de base de datos forma parte de la característica del libro de contabilidad. El libro de contabilidad de base de datos captura de forma incremental el estado de una base de datos a medida que evoluciona con el tiempo, mientras se producen actualizaciones en las tablas del libro de contabilidad. Usa de forma lógica una cadena de bloques y estructuras de datos de un árbol de Merkle.

Cualquier operación que actualice una tabla de libro de contabilidad debe realizar algunas tareas adicionales para mantener los datos históricos y calcular los resúmenes capturados en el libro de contabilidad de la base de datos. En concreto, en cada fila actualizada, debemos:

  • Conservar la versión anterior de la fila en la tabla de historial.
  • Asignar el identificador de transacción y generar un nuevo número de secuencia, y conservarlos en las columnas del sistema adecuadas.
  • Serializar el contenido de la fila e incluirlo al calcular el hash para todas las filas actualizadas por esta transacción.

El libro de contabilidad lleva eso a cabo extendiendo los planes de consulta del lenguaje de manipulación de datos (DML) de todas las operaciones de inserción, actualización y eliminación destinadas a las tablas del libro de contabilidad. El identificador de transacción y el número de secuencia recién generado se establecen para la nueva versión de la fila. Después, el operador del plan de consulta ejecuta una expresión especial que serializa el contenido de fila y calcula su hash, anexándolo a un árbol de Merkle almacenado en el nivel de transacción y contiene los hash de todas las versiones de fila actualizadas por esta transacción de esta tabla de libro de contabilidad. La raíz del árbol representa todas las actualizaciones y eliminaciones realizadas por esta transacción en esta tabla de libro de contabilidad. Si la transacción actualiza varias tablas, se conserva un árbol de Merkle independiente por cada tabla. En la siguiente ilustración se muestra un ejemplo de un árbol de Merkle que almacena las versiones de fila actualizadas de una tabla de libro de contabilidad y el formato usado para serializar las filas. Aparte del valor serializado de cada columna, incluimos también metadatos relacionados con el número de columnas de la fila, el ordinal de columnas individuales, los tipos de datos, las longitudes y otra información que afecta a cómo se interpretan los valores.

Diagram that shows a Merkle Tree storing the updated row versions of a ledger table and the format used to serialize the rows

Para capturar el estado de la base de datos, el libro de contabilidad de la base de datos almacena una entrada para cada transacción. Captura metadatos sobre la transacción, como su marca de tiempo de confirmación y la identidad del usuario que la ejecutó. También captura la raíz del árbol de Merkle de las filas actualizadas en cada tabla del libro de contabilidad (ver arriba). A continuación, estas entradas se anexan a una estructura de datos con evidencias de alteración para que se pueda comprobar su integridad en el futuro. Se cierra un bloque:

Cuando se cierra un bloque, se insertarán nuevas transacciones en un nuevo bloque. A continuación, el proceso de generación de bloques:

  1. Recupera todas las transacciones que pertenecen al bloque cerrado de la cola en memoria y de la vista del catálogo del sistema sys.database_ledger_transactions.
  2. Calcula la raíz del árbol de Merkle sobre estas transacciones y el hash del bloque anterior.
  3. Conserva el bloque cerrado en la vista del catálogo del sistema sys.database_ledger_blocks.

Dado que se trata de una actualización de tabla normal, el sistema garantiza automáticamente su durabilidad. Para mantener la cadena única de bloques, esta operación es de un solo subproceso. Sin embargo, también es eficaz, ya que solo calcula los hashes sobre la información de la transacción y se produce de forma asincrónica. Esto no afecta al rendimiento de la transacción.

Diagram that shows a Merkle Tree storing the transactions of a ledger table.

Para obtener más información sobre cómo el libro de contabilidad proporciona integridad de datos, consulte Administración de resúmenes y Comprobación de la base de datos.

¿Dónde se almacenan los datos de bloques y transacciones de la base de datos?

Los datos relativos a las transacciones y los bloques se almacenan físicamente como filas en dos nuevas vistas de catálogo del sistema:

  • sys.database_ledger_transactions: mantiene una fila con la información de cada transacción en el libro de contabilidad de la base de datos. La información incluye el identificador del bloque al que pertenece esta transacción y el ordinal de la transacción dentro del bloque.
  • sys.database_ledger_blocks: mantiene una fila para cada bloque del libro de contabilidad, incluida la raíz del árbol de Merkle sobre las transacciones del bloque y el hash del bloque anterior para formar una cadena de bloques.

Para ver el libro de contabilidad de la base de datos, ejecute las siguientes instrucciones T-SQL en SQL Server Management Studio, Azure Data Studio o Herramientas de SQL Server Developer.

SELECT * FROM sys.database_ledger_transactions;
GO

SELECT * FROM sys.database_ledger_blocks;
GO

El ejemplo siguiente de una tabla de libro de contabilidad consta de cuatro transacciones que componen un bloque en la cadena de bloques del libro de contabilidad de la base de datos:

Screenshot of an example ledger table.

Permisos

Para poder ver el libro de contabilidad de la base de datos se necesita el permiso VIEW LEDGER CONTENT. Para obtener más información sobre los permisos relacionados con las tablas del libro de contabilidad, consulte Permisos.