Sql server: registro de erros e relatórios dentro de um procedimento armazenado

longa-sql

Como o número de procedimentos armazenados aumenta em um banco de dados, a carga de gerenciar esses procedimentos armazenados aumenta também. Em um banco de dados de produção, milhares de procedimentos são executados diariamente, assim que você é obrigado a saber por que um procedimento armazenado falhou em um determinado momento. Isto pode ser feito através da implementação de registro de erros e relatórios dentro de cada procedimento armazenado.

Uma vez que uma questão foi levantada em um banco de dados de produção, você precisa resolvê-lo imediatamente para parar a perda de um negócio. Para monitorar e resolver erros de procedimento armazenado, em primeiro lugar você precisa se logar se ocorrer algum erro e, em seguida, monitorar e executar o relatório de erros.

Vamos criar um procedimento simples para cálculo da divisão.

CRIAR PROCEDIMENTO dbo.MathCalculation (@Dividend INT, @ Divisor INT) ASBEGINSET NOCOUNT ON-BEGIN TRYSELECT @ Dividendo / @ Divisor como Quociente-END TRYBEGIN CATCHPRINT ERROR_MESSAGE () - END CATCHSET NOCOUNT OFF-ENDGO

Eu criei um procedimento simples armazenado para dividir dois números e obter o seu quociente. Vamos ver como ele funciona quando realizamos dividir por 0 operação.

EXEC dbo.MathCalculation 100, 2 - funciona perfeitamente dando 50 como quotientEXEC dbo.MathCalculation 100, 0 - divisão por zero erro encontrado

sql relatórios de erro do servidor em procedimentos armazenados dividir por zero exceção

O cálculo acima falhar e imprime uma mensagem de erro em uma janela de mensagem de erro Divisão por zero erro encontrado.

Agora que você está vendo erros na tela, mas em um ambiente de produção, você não tem essa flexibilidade. Portanto, precisamos implementar o registo de erros.

Vamos criar uma tabela para registrar todos os erros de procedimento armazenado.

CREATE TABLE [dbo]. [LearningErrorLog] ([ErrorID] [bigint] IDENTIDADE (1,1) NOT NULL PRIMARY KEY, [ErrorNumber] [nvarchar] (50) NOT NULL, [ErrorDescription] [nvarchar] (4000) NULL, [ErrorProcedure] [nvarchar] (100) NULL, [ErrorState] [int] NULL, [ErrorSeverity] [int] NULL, [ErrorLine] [int] NULL, [ErrorTime] [data e hora] NULL) -

Vamos criar um procedimento armazenado para registrar erros.

CREATE PROCEDURE [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] ASBEGINSET NOCOUNT OnInsert INTO [LearningErrorLog](ErrorNumber,ErrorDescription,ErrorProcedure,ErrorState,ErrorSeverity,ErrorLine,ErrorTime)VALUES(ERROR_NUMBER(),ERROR_MESSAGE(),ERROR_PROCEDURE(),ERROR_STATE(),ERROR_SEVERITY(),ERROR_LINE(),GETDATE())-SET NOCOUNT OFENDO

Eu chamei funções de relatório de erro embutidos no procedimento acima armazenado.

ERROR_NUMBER () - retorna o número de erro do erro que causou o bloco CATCH de uma construção TRY ... CATCH para ser executado

MENSAGEM DE ERRO() - retorna o texto da mensagem do erro que causou o bloco CATCH de uma construção TRY ... CATCH para ser executado

ERROR_PROCEDURE () - Retorna o nome do procedimento armazenado ou gatilho no qual ocorreu um erro que causou o bloco CATCH de uma construção TRY ... CATCH para ser executado

ERROR_STATE () - retorna o número de estado do erro que causou o bloco CATCH de uma construção TRY ... CATCH para ser executado

ERROR_SEVERITY () - retorna a gravidade do erro que causou o bloco CATCH de uma construção TRY ... CATCH para ser executado

GETDATE () - retorna o tempo de o erro que causou

Agora, podemos consultar [LearningErrorLog] mesa para monitorar o erro registrado.

Vamos modificar a nossa MathCalculation procedimento armazenado e chamada [Learning_Insert_StoredProcedure_ErrorLog] dentro do bloco catch para executar o log de erro se ocorreu qualquer erro dentro de procedimento armazenado.

ALTER PROCEDURE dbo.MathCalculation (@Dividend INT, @ Divisor INT) ASBEGINSET NOCOUNT ON-BEGIN TRYSELECT @ Dividendo / @ Divisor como Quociente-END TRYBEGIN CATCHEXEC [dbo]. [Learning_Insert_StoredProcedure_ErrorLog] --Para log procedimento armazenado errorsEND CATCHSET NOCOUNT OFF-ENDGO

Agora, novamente executar cenário geração de erro.

EXEC dbo.MathCalculation 100, 0 - divisão por cenário de erro 0 

Consultar a tabela [LearningErrorLog]. Você pode ver a exceção captura de erro procedimento armazenado foi registado na tabela.

log de erro tabela de procedimento armazenado

» » Sql server: registro de erros e relatórios dentro de um procedimento armazenado