Tienes idea!. Las operaciones con variables de tablas no se pueden deshacer. Solo llenando tu log desde la variable de tabla puedes llenar hasta que punto se quedo tu transaccion. Por su puesto, tienes que recordar, que todas las entradas que preceden en el log al error fueron deshechas (rollbak). Si corriges el error de tiempo de ejecucion en la linea 26, la transaccion es confirmada (commit) y la vida continua.
CREATE TABLE #log_temp ( msg VARCHAR(255) ) --main log tbl DECLARE @t TABLE (msg VARCHAR(255)) --our backup log CREATE TABLE #t ( i INT ) BEGIN TRAN BEGIN TRY INSERT #t VALUES (1) INSERT #log_temp VALUES ( 'first') INSERT @t VALUES('first') INSERT #t VALUES (2) INSERT #log_temp VALUES ( 'second') INSERT @t VALUES('second') INSERT #t VALUES (3) INSERT #log_temp VALUES ( 'third') INSERT @t VALUES('third') INSERT #t VALUES (4) INSERT #log_temp VALUES ('fourth') INSERT @t VALUES('fourth') INSERT #t VALUES (5) INSERT #log_temp VALUES ('fifth') INSERT @t VALUES('fifth') INSERT #t VALUES ('v') --introduce a runtime error INSERT #log_temp VALUES ('sixth') INSERT @t VALUES('sixth') INSERT #t VALUES (7) INSERT #log_temp VALUES ('seventh') INSERT @t VALUES('seventh') INSERT #t VALUES (8) INSERT #log_temp VALUES ('eighth') INSERT @t VALUES('eighth') END TRY BEGIN CATCH SELECT * FROM #t -- data still there ROLLBACK TRAN --clears everything including log_temp SELECT * FROM #log_temp --log is gone SELECT * FROM #t -- data is gone INSERT #log_temp SELECT * FROM @t --backfill the log INSERT #log_temp VALUES('Rollback: '+error_message()) --insert the reason for rollback END CATCH IF @@trancount>0 COMMIT TRAN DROP TABLE #t SELECT * FROM #log_temp -- log is back including the last error DROP TABLE #log_temp
Entradas relacionadas