none
Sem o commit é salvo as alterações ? Como buscar um erro e acionar o rolback ? RRS feed

  • Pergunta

  • Sem o commit é salvo as alterações ? Como buscar um erro e acionar o rolback ?

    BEGIN

    BEGIN TRAN T1;

    INSERT INTO login_tentativa_clientes_historico (login_tentativa_clientes_id, ip_origem, data_tentativa, obs, clientes_id)
    SELECT login_tentativa_clientes_id, ip_origem, data_tentativa, obs, clientes_id FROM login_tentativa_clientes
    WHERE clientes_id = @cliente_id 

    DELETE FROM login_tentativa_clientes WHERE clientes_id = @cliente_id 

    COMMIT TRAN T1; 

    END

    terça-feira, 16 de junho de 2020 03:32

Todas as Respostas

  • Bom dia,

    Os dados são salvos de forma definitiva após a execução do Commit ao utilizar uma transação.

    Sobre o tratamento de erros, você pode utilizar blocos Try/Catch:

    https://docs.microsoft.com/pt-br/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-ver15

    Espero que ajude


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 16 de junho de 2020 12:39
  • Boa

    Obrigado!

    terça-feira, 16 de junho de 2020 17:51
  • Danews,

    Esta é uma das questões que normalmente os profissionais de desenvolvimento tem maiores dúvidas relacionadas ao comportamento do SQL Server, o qual esta relacionado com o uso dos comandos Commit ou Rollback, ambos utilizados em conjunto com o comando Begin Transaction.

    Normalmente o SQL Server trabalha com o nível de isolamento chamado Read Committed, ou seja, realize a leitura e confirme a transação que esta sendo processada, esta ação de confirmação esta relacionada com um dos componentes internos mais importantes do SQL Server chamado de Checkpoint, o qual a cada "x" milésimos de segundos executa esta instrução como um elemento que deverá "confirmar" o que sendo executado.

    Quando estamos trabalhando com os chamados blocos transacionais, onde declaramos transações explícitas ou implícitas teoricamente somente nós que assumimos o controle de realizar a confirmação ou reversão do que estava para ser confirmado, através do Commit ou Rollback.

    Até o SQL Server 2005, basicamente a forma mais utilizada para se identificar, capturar e até mesmo estabelecer um possível tratamento era feito utilizando a variável de sistema @@Error, a qual nos permitia identificar o código de erro, bem como, em combinação do operador lógico condicional IF estabelecer uma condição se ocorrer um possível erro realizar uma ação.

    A partir da versão 2005 foram adicionadas novas funções de captura e identificação de erros que em conjunto com os comando Begin Try e Begin Catch nos permitem estabelecer o chamado "bloco de código protegido" e o "bloco de código de tratamento e apresentação", que será executado na ocorrência do erro".

    Para saber mais sobre estas funções e formas de uso acesse:

    sys.messages (Transact-SQL)
    TRY...CATCH (Transact-SQL)
    ERROR_LINE (Transact-SQL)
    ERROR_MESSAGE (Transact-SQL)
    ERROR_PROCEDURE (Transact-SQL)
    ERROR_SEVERITY (Transact-SQL)
    ERROR_STATE (Transact-SQL)
    RAISERROR (Transact-SQL)
    @@ERROR (Transact-SQL)
    Errors and Events Reference (Database Engine)


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 16 de junho de 2020 22:39
    Moderador
  • begin tran; begin try; insert ...; delete ...; end try
    begin catch select ...; rollback; end catch
    if @@trancount > 0 commit

    https://docs.microsoft.com/pt-br/sql/t-sql/language-elements/try-catch-transact-sql?view=sql-server-ver15

    Recuperando informações de erro

    No escopo de um bloco CATCH, as seguintes funções de sistema podem ser usadas para obter informações sobre o erro que causou a execução do bloco CATCH.

    • ERROR_NUMBER() retorna o número do erro.

    • ERROR_SEVERITY() retorna a severidade.

    • ERROR_STATE() retorna o número do estado do erro.

    • ERROR_PROCEDURE() retorna o nome do procedimento armazenado ou do gatilho no qual ocorreu o erro.

    • ERROR_LINE() retorna o número de linha dentro da rotina que causou o erro.

    • ERROR_MESSAGE() retorna o texto completo da mensagem de erro. O texto inclui os valores fornecidos para qualquer parâmetro substituível, como comprimentos, nomes de objeto ou horas.

    Essas funções retornarão NULL se forem chamadas fora do escopo do bloco CATCH.As informações de erro podem ser recuperadas com o uso dessas funções em qualquer lugar no escopo do bloco CATCH.Por exemplo, o script a seguir mostra um procedimento armazenado que contém funções de tratamento de erros.No bloco CATCH de uma construção TRY...CATCH, o procedimento armazenado é chamado e as informações sobre o erro são retornadas.

    BEGIN TRANSACTION;  
     
    BEGIN TRY  
        -- Generate a constraint violation error.  
        DELETE FROM Production.Product  
        WHERE ProductID = 980;  
    END TRY  
    BEGIN CATCH  
        SELECT   
            ERROR_NUMBER() AS ErrorNumber  
            ,ERROR_SEVERITY() AS ErrorSeverity  
            ,ERROR_STATE() AS ErrorState  
            ,ERROR_PROCEDURE() AS ErrorProcedure  
            ,ERROR_LINE() AS ErrorLine  
            ,ERROR_MESSAGE() AS ErrorMessage;  
     
        IF @@TRANCOUNT > 0  
            ROLLBACK TRANSACTION;  
    END CATCH;  
     
    IF @@TRANCOUNT > 0  
        COMMIT TRANSACTION;  
    GO



    • Editado Avatar SQL quarta-feira, 17 de junho de 2020 18:13
    quarta-feira, 17 de junho de 2020 16:39
  • Maravilha, ajudaram muito!
    sábado, 20 de junho de 2020 12:29
  • Daniel,

    Ok, por gentileza, caso alguma resposta aqui possa ter lhe ajudado, por gentileza, marque-a.


    Pedro Antonio Galvão Junior [MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    domingo, 21 de junho de 2020 16:02
    Moderador