Registro e informe de errores de SQL Server dentro de un procedimiento almacenado

A medida que aumenta el número de procedimientos almacenados en una base de datos, también aumenta la carga de administrar esos procedimientos almacenados. En una base de datos de producción, miles de procedimientos se ejecutan diariamente, por lo que se le exige que sepa por qué un procedimiento almacenado falló en un momento determinado. Esto se puede hacer implementando el registro de errores y los informes dentro de cada procedimiento almacenado.

Una vez que se ha planteado un problema en una base de datos de producción, debe resolverlo inmediatamente para detener la pérdida de una empresa. Para monitorear y resolver errores de procedimientos almacenados, primero debe registrar si ocurre algún error y luego monitorear y realizar informes de errores.

Vamos a crear un procedimiento simple para el cálculo de la división.

CREAR PROCEDIMIENTO dbo.MathCalculation (@Dividend INT, @Divisor INT) COMO COMENZAR A HACER EL CONTABILIDAD ENCENDIDO; COMIENCE LA PRUEBA SELECCIONE @ Dividendo / @ Divisor como Cociente; END TRY BEGIN CATCH PRINT Error_message (); FIN DE CAPTURA AJUSTE NOCOUNT OFF; Fin ir

He creado un procedimiento almacenado simple para dividir dos números y obtener su cociente. Veamos cómo funciona cuando realizamos la operación de dividir por 0.

EXEC dbo.MathCalculation 100, 2 - Funciona perfectamente dando 50 como cociente EXEC dbo.MathCalculation 100, 0 - Se encontró un error de división por cero

El cálculo anterior falla e imprime un mensaje de error en una ventana de mensaje de error Ocurrió un error de división por cero.

Ahora está viendo errores en la pantalla, pero en un entorno de producción, no obtiene tal flexibilidad. Por lo tanto, necesitamos implementar el registro de errores.

Vamos a crear una tabla para registrar todos los errores de procedimientos almacenados.

CREAR TABLA [dbo]. [LearningErrorLog] ([ErrorID] [bigint] IDENTIDAD (1,1) NO CLAVE PRIMARIA NULA, [ErrorNumber] [nvarchar] (50) NOT NULL, [ErrorDescription] [nvarchar] (4000) NULL, [ErrorProcedure] [nvarchar] (100) NULL, [ErrorState] [int] NULL, [ErrorSeverity] [int] NULL, [ErrorLine] [int] NULL, [ErrorTime] [datetime] NULL);

Vamos a crear un procedimiento almacenado para registrar errores.

CREAR PROCEDIMIENTO [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] INICIE A LA CONEXIÓN EN [LearningErrorLog] (ErrorNumber, Error, Porcentaje de, es, por ejemplo, Porcentaje, Porcentaje, Porcentaje, Porcentaje, Porcentaje, Porcentaje, Porcentaje, Porcentaje, Porcentaje, Porcentaje, Porcentaje, Porcentaje ), ERROR_SEVERITY (), ERROR_LINE (), GETDATE ()); CONFIGURAR NOCOUNT OFF END

He llamado funciones de informe de errores incorporadas en el procedimiento almacenado anterior.

NUMERO ERRONEO() - devuelve el número de error del error que causó que se ejecutara el bloque CATCH de una construcción TRY… CATCH

MENSAJE DE ERROR() - devuelve el texto del mensaje del error que causó que se ejecutara el bloque CATCH de una construcción TRY… CATCH

ERROR_PROCEDIMIENTO () - devuelve el nombre del procedimiento almacenado o el activador donde ocurrió un error que causó que se ejecutara el bloque CATCH de una construcción TRY ... CATCH

ERROR_STATE () - devuelve el número de estado del error que causó que se ejecutara el bloque CATCH de una construcción TRY… CATCH

ERROR_SEVERITY () - devuelve la gravedad del error que causó que se ejecutara el bloque CATCH de una construcción TRY… CATCH

OBTENER LA FECHA() - Devuelve el tiempo del error que causó.

Ahora, podemos consultar [LearningErrorLog] Tabla para monitorear el error registrado.

Vamos a modificar nuestra Cálculo matemático procedimiento almacenado y llamada [Learning_Insert_StoredProcedure_ErrorLog] dentro del bloque catch para realizar el registro de errores si se produjo algún error dentro del procedimiento almacenado.

ALTERAR PROCEDIMIENTO dbo.MathCalculation (@Dividend INT, @Divisor INT) COMO COMENZAR A HACER EL CONTABILIDAD ENCENDIDO; COMIENCE LA PRUEBA SELECCIONE @ Dividendo / @ Divisor como Cociente; END TRY BEGIN CATCH EXEC [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] - Para registrar errores de procedimientos almacenados END CATCH SET NOCOUNT OFF; Fin ir

Ahora, ejecute nuevamente el escenario de generación de errores.

EXEC dbo.MathCalculation 100, 0 - dividir entre 0 escenario de error 

Consulta la tabla [LearningErrorLog]. Puede ver que el error del procedimiento almacenado de excepción de captura se ha registrado en la tabla.