transaction stored shrinkdatabase log ejemplo sql-server tsql logging transactions

sql-server - stored - truncate log sql server 2014



TSQL logging dentro de transacción (5)

Hago esto de una de las dos maneras, dependiendo de mis necesidades en ese momento. Ambos implican el uso de una variable, que conserva su valor después de una reversión.

1) Cree un valor DECLARE @Log varchar(max) y use esto: @SET @ Log = ISNULL (@ Log + '';'', '''') + ''Su nueva información de registro aquí'' . Keep appending to this as you go through the transaction. I''ll insert this into the log after the commit or the rollback as necessary. I''ll usually only insert the @Log value into the real log table when there is an error (in the . Keep appending to this as you go through the transaction. I''ll insert this into the log after the commit or the rollback as necessary. I''ll usually only insert the @Log value into the real log table when there is an error (in the . Keep appending to this as you go through the transaction. I''ll insert this into the log after the commit or the rollback as necessary. I''ll usually only insert the @Log value into the real log table when there is an error (in the bloque CATCH`) o si estoy tratando de solucionar un problema.

2) cree una DECLARE @LogTable table (RowID int identity(1,1) primary key, RowValue varchar(5000) . Lo inserto a medida que avanza en su transacción. Me gusta usar la cláusula OUTPUT para insertar las ID reales (y otras columnas con mensajes, como ''BORRAR artículo 1234'') de filas utilizadas en la transacción en esta tabla con. Insertaré esta tabla en la tabla de registro real después de la confirmación o la reversión según sea necesario.

Estoy intentando escribir en un archivo de registro dentro de una transacción para que el registro sobreviva incluso si la transacción se revierte.

- código de inicio

comenzar tran

inserta [algo] en dbo.logtable

[[código principal aquí]]

Retroceder

cometer

- código final

Podría decir que simplemente haga el registro antes de que comience la transacción, pero eso no es tan fácil porque la transacción comienza antes de que se ejecute este S-Proc (es decir, el código es parte de una transacción más grande)

Entonces, en resumen, ¿hay una manera de escribir una declaración especial dentro de una transacción que no sea parte de la transacción? Espero que mi pregunta tenga sentido.


Si desea emular el comportamiento de una transacción anidada, puede usar transacciones con nombre:

begin transaction a create table #a (i int) select * from #a save transaction b create table #b (i int) select * from #a select * from #b rollback transaction b select * from #a rollback transaction a

En SQL Server, si desea una ''sub-transacción'', debe usar save transaction xxxx que funciona como un punto de control de Oracle.


Si la transacción principal se revierte, los datos de registro también se revertirán: el servidor SQL no admite las transacciones anidadas adecuadas. Una posibilidad es usar un procedimiento almacenado CLR para hacer el registro. Esto puede abrir su propia conexión a la base de datos fuera de la transacción e ingresar y confirmar los datos de registro.


Utilice una variable de tabla (@temp) para mantener la información de registro. Las variables de tabla sobreviven a una reversión de transacción.

Ver este articulo