Incluindo em sua procedure Tratamentos de Erro

 

Quem já programa usando C#/ VB.net deve estar bem acostumado com a estrutura para tratamento de erros TRY – CATCH…

No Oracle manipulamos os erros com estruturas BEGIN – Exception – END…

E no SQL Server 2005, como é feita a manipulação dos erros?

Através da estrutura  Begin Try – End Try | Begin Catch – End Catch, podemos fazer todo o tratamento de erros.

Veja o exemplo abaixo:

Begin Try
         -- Códigos onde uma falha pode ocorrer
End Try

Begin Catch
         --Tratamento do Erro
End catch


Esta é a sintaxe básica para o tratamento de erros, mas aí vão algumas dicas:

·         Se algum código for incluído entre o End Try e o Begin Catch, um erro será gerado! Então não inclua nada entre o End try e o Begin Catch!

·         Procure sempre usar transações! Principalmente se a sua procedure possuir comandos de Insert/ Update/ Delete. Com isso você garante que seus dados estejam consistentes. Além da vantagem de poder incluir o comando ROLLBACK quando um erro acontecer. Abaixo temos um exemplo deste uso.

Create Procedure pTeste  @param int

AS

Begin Try

         Begin Tran

                   Delete From teste Where ID = @param

         Commit Tran

End Try

Begin Catch

         Rollback Tran

End Catch


Como usar XACT_ABORT e XACT_STATE

 

A opção XACT_ABORT é usada para que o SQL Server automaticamente faça o rollback da transação quando ocorre um erro em tempo de execução.

Mas, se o erro estiver dentro de um bloco TRY, um rollback não ocorre automaticamente, e também a transação não será efetivada.P or isso é preciso testar se um erro ocorreu no bloco CATCH.

Para fazer este teste usaremos a função XACT_STATE. Esta função retorna -1, se a transação não foi efetivada. Se a transação não foi efetivada, é preciso executar o comando rollback manualmente. Se o retorno da função XACT_STATE for 1 nenhum erro ocorreu, e a transação pode ser efetivada através do comando commit. Se a função retornar 0, significa que não há transação ativa.

Veja o exmplo abaixo, onde usaremos a opção XACT_ABORT e a função XACT_STATE.

 

SET XACT_ABORT ON

BEGIN TRY

BEGIN TRAN --comandos onde um erro pode ocorrer

COMMIT TRAN – efetivando a transação

END TRY

BEGIN CATCH

IF (XACT_STATE()) = -1 – um erro ocorreu

ROLLBACK TRAN – cancelando a transação

ELSE IF (XACT_STATE()) = 1  -- nenhum erro ocorreu

COMMIT TRAN –efetive a transação

END CATCH

 

Capturando um Erro

 

Vamos supor que você criar um log de erros em suas procedures/ packages. Neste log você gravará informações específicas de cada erro.

Para alcançar este objetivo você poderá usar as funções do SQL Server que retornam informações sobre os erros que ocorreram em uma transação.

Veja a tabela abaixo:

Função

Retorno

ERROR_LINE

Retorna o número da linha onde ocorreu o erro

ERROR_MESSAGE

Retorna informações sobre a causa do erro

ERROR_NUMBER

Retorna o número de identificação do erro

ERROR_PROCEDURE

Retorna o nome da procedure ou trigger onde o erro ocorreu

ERROR_SEVERITY

Todo erro possui um grau de severidade. Quanto maior a severidade do erro, mais grave ele é.

Esta função retorna um indicador numérico com a severidade do erro.

ERROR_STATE

Retorna o estado do erro. Considerando que diversos pontos do seu código podem gerar erros. Cada um desses erros possui um identificador de estado único, que é retornado por esta função.

 

Conclusão

 

O SQL Server 2005 possui uma suite muito robusta para tratamento de erros. Use estas funções, métodos e comandos ao seu favor! Com elas será mais fácil manter a consistência dos seus dados, já que quando um erro ocorre, ele pode ser tratado, armazenado, manipulado sem gerar um trabalho excessivo.

Aproveite estas facilidades e construa procedures, packages, functios e triggers melhores!!!

Espero que este artigo tenha sido útil, e em caso de dúvidas é só entrar em contato comigo no email dani@wbsoft.com.br !!!

 

Abraços Danielle!

 

Referência

SQL Server Books Online