Usuário com melhor resposta
Dúvida RAISERROR

Pergunta
-
Bom dia pessoal,
Estou com uma dúvida em usar o raiserror. Bom eu tenho uma stored procedure simples para inserir dados no bd. obs Uso o sql 2005.
É correto usar o raiserror para validar o dado inserido? por exemplo:
INSERT INTO (nome,sobrenome) values (@nome,@sobrenome)
RAISERROR('SUCESSO',1,10).
Caso não seja correto qual seria a melhor maneira de fazer esse processo?
att Eduardo A
Respostas
-
Eduardo,
Mas neste caso não é banco de dados que tem que dar o retorno, e sim a aplicação, esse deve ser o comportamento padrão.
Como o Gustavo destacou, caso a sua aplicação recebe algum retorno de erro isso indica a ocorrência de alguma falha no processo, então você também terá que fazer este tipo de tratamento.
O mais importante em uma aplicação não é apresentar mensagens que satisfação a execução correta dos procedimentos, mas sim apresentar, interpretar e identificar erros, fazendo seu tratamento e exibindo para o usuário da melhor forma possível.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
- Marcado como Resposta Eduardo Alexandre da Silva sexta-feira, 16 de março de 2012 19:13
Todas as Respostas
-
Bom Dia,
Não é comum utilizar o RAISERROR para validar o conteúdo inserido e nenhuma outra validação. RAISERROR normalmente é utilizado para lançar warnings e exceções. O que costumo ver (e fazer) é codificar o código para que os erros e exceções sejam lançados. Se nada for lançado, concluí-se que o conteúdo correto foi gravado.
No seu caso específico, eu acho que é um excesso muito grande de zelo, verificar se um INSERT foi correto. Veja que se o INSERT não funcionar, um erro será lançado e se funcionar, fucionou. Não acho que exista necessidade ou benefício de colocar um RAISERROR depois do INSERT. Nessa linha você tornará seu código extremamente poluído e sem um benefício aparente.
[ ]s,
Gustavo Maia Aguiar
Blog: http://gustavomaiaaguiar.wordpress.com
Vídeos:http://www.youtube.com/user/gmasqlClassifique as respostas. O seu feedback é imprescindível
- Sugerido como Resposta Junior Galvão - MVPMVP quinta-feira, 15 de março de 2012 19:37
-
-
Bom dia,
Só para deixar o feedback eu costumo trabalhar com a variavel @@error
exe:
CREATE PROCEDURE spc_teste @Nome VARCHAR(20) ,@Situacao CHAR(1) AS DECLARE @ERRO INT SET @ERRO = 0 BEGIN TRAN INSERT INTO Tipo VALUES (@Nome, @Situacao) IF @@ERROR <> 0 SET @ERRO = 1 INSERT INTO Tipo2 VALUES (@Nome, @Situacao, 'OBS') IF @@ERROR <> 0 SET @ERRO = 1 -- MAIS CODIGOS IF @ERRO = 0 COMMIT ELSE BEGIN ROLLBACK RAISERROR 20002 'Erro de Transacao' END
Mas eu concordo com Gustavo, se a sua necessidade seria informar o usuário que ocorreu sucesso, isso deveria ser tratado na aplicação.
Isco Sistemas José Luiz Borges
- Editado Jose Luiz Borges quinta-feira, 15 de março de 2012 13:54
-
Eduardo,
Mas neste caso não é banco de dados que tem que dar o retorno, e sim a aplicação, esse deve ser o comportamento padrão.
Como o Gustavo destacou, caso a sua aplicação recebe algum retorno de erro isso indica a ocorrência de alguma falha no processo, então você também terá que fazer este tipo de tratamento.
O mais importante em uma aplicação não é apresentar mensagens que satisfação a execução correta dos procedimentos, mas sim apresentar, interpretar e identificar erros, fazendo seu tratamento e exibindo para o usuário da melhor forma possível.
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]
- Marcado como Resposta Eduardo Alexandre da Silva sexta-feira, 16 de março de 2012 19:13
-
Eduardo,
Veja este código exemplo:
BEGIN TRY BEGIN TRAN INSERT INTO OBJETO VALUES (1, 'Primeira coluna', 'Primeira coluna'); INSERT INTO OBJETO VALUES (2, null, 'Segunda coluna'); INSERT INTO OBJETO VALUES (3, 'Terceira coluna', 'Terceira coluna'); COMMIT TRAN; END TRY BEGIN CATCH SELECT ERROR_NUMBER() AS "ERROR_NUMBER", ERROR_SEVERITY() AS "ERROR_SEVERITY", ERROR_STATE() AS "ERROR_STATE", ERROR_PROCEDURE() AS "ERROR_PROCEDURE", ERROR_LINE() AS "ERROR_LINE", ERROR_MESSAGE() AS "ERROR_MESSAGE" RAISERROR('Erro na transação', 14, 1) ROLLBACK TRAN; END CATCH;
Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | SorBR.Net | Professor Universitário | MSIT.com]