none
Dúvida RAISERROR RRS feed

  • 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

    quinta-feira, 15 de março de 2012 12:22

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]

    quinta-feira, 15 de março de 2012 19:40

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/gmasql


    Classifique as respostas. O seu feedback é imprescindível

    quinta-feira, 15 de março de 2012 12:27
  •    Entendo, é que por exemplo, na minha aplicação eu preciso de um retorno do banco para exibir uma mensagem para o usuário de cadastro com sucesso . 
    quinta-feira, 15 de março de 2012 12:44
  • 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


    quinta-feira, 15 de março de 2012 13:52
  • 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]

    quinta-feira, 15 de março de 2012 19:40
  • 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]

    quinta-feira, 15 de março de 2012 19:41