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