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
Consulte Registro de mensajes durante una transacción para obtener una solución alternativa basada en el sp_trace_generateevent
que no requiera una variable @table de ámbito (que no siempre es posible) o cuando los límites de la transacción están fuera de control.