none
Set xact_abort on gravando pela metade RRS feed

  • Pergunta

  • Senhores, minha SP ta apresentando um comportamento estranho, embora eu tenha usado o XACT abort on, ela continua executando o outro bloco (e gravando). Percebi que isso ocorre pois estou entrando no If Exists, alguma sugestao? 

    SET XACT_ABORT ON

    BEGIN TRANSACTION

    -- CHECA EXISTENCIA DA PESSOA JURIDICA
    IF NOT EXISTS (SELECT NR_CNPJ FROM PESSOA_JURIDICA WHERE NR_CNPJ = NR_CNPJ)
    --SE NAO EXISTIR PESSOA JURIDICA FAZ INSERÇAO
    --BEGIN 
    INSERT PESSOA JURIDICA BLA BLA BLA (AQUI ESTOU LANÇANDO UM ERRO DE PROPOSITO)
    --END
    ELSE
    -- SE HOUVER PESSOA JURIDICA FAZ UPDATE
    --BEGIN
    UPDATE PESSOA JURIDICA
    --END

    -- APOS INSERIR PJ Grava o Fornecedor

    -- NAO DEVERIA ESTAR GRAVANDO, POIS DEU ERRO LA NO INSERT ACIMA.

    INSERT FORNECEDOR BLA BLA BLA

    COMMIT TRANSACTION



    • Editado Maxlei Luz sexta-feira, 24 de outubro de 2014 13:12 Negrito
    sexta-feira, 24 de outubro de 2014 13:10

Respostas

  • Maxlei,

    Existe alguns pontos à observar para executar o ROLLBACK com o XACT_ABORT: 

    1 - Ele entrou no "IF"? Faça um teste substituíndo o NR_CNPJ pelo número do CNPJ que você está buscando. Adicione um "PRINT", habilitando novamente o "BEGIN-END" para ter certeza por onde esta passando (INSERT ou UPDATE);

    2 - Sua cláusula WHERE sempre atende o requisito, uma vez que neste script sempre é "verdadeiro"

    FROM PESSOA_JURIDICA WHERE NR_CNPJ = NR_CNPJ

    Para maiores informações veja:

    http://technet.microsoft.com/en-us/library/aa259192(v=sql.80).aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    sexta-feira, 24 de outubro de 2014 14:07
    Moderador
  • Maxlei,

    Então, o Set XACT_Abort orienta o SQL Server é realizar um comportamento ao contrário durante a execução do bloco transact-sql em caso de falha.

    Se você esta fazendo uso desta instrução em conjunto com o Rollback, provavelmente o comportamento do SQL Server neste caso, será o contrário do Rollback somente se a sua instrução apresentar alguma erro de execução.

    Quando SET XACT_ABORT é ON, se uma instrução Transact-SQL gera um erro de tempo de execução, a transação inteira é encerrada e revertida.

    Quando SET XACT_ABORT é OFF, em alguns casos, somente a instrução Transact-SQL que gerou o erro é revertida e a transação continua a ser processada. Dependendo da gravidade do erro, a transação inteira pode ser revertida mesmo quando SET XACT_ABORT é OFF. OFF é a configuração padrão.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 24 de outubro de 2014 18:28

Todas as Respostas

  • Maxlei,

    Existe alguns pontos à observar para executar o ROLLBACK com o XACT_ABORT: 

    1 - Ele entrou no "IF"? Faça um teste substituíndo o NR_CNPJ pelo número do CNPJ que você está buscando. Adicione um "PRINT", habilitando novamente o "BEGIN-END" para ter certeza por onde esta passando (INSERT ou UPDATE);

    2 - Sua cláusula WHERE sempre atende o requisito, uma vez que neste script sempre é "verdadeiro"

    FROM PESSOA_JURIDICA WHERE NR_CNPJ = NR_CNPJ

    Para maiores informações veja:

    http://technet.microsoft.com/en-us/library/aa259192(v=sql.80).aspx

    Se ajudou na sua solução, não esqueça de marcar como resposta !

    Abraços,

    Durval Ramos
    Microsoft Partner | MTA | MCSA - SQL Server 2012 | MCSE - Data Platform
    ----------------------------------
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    sexta-feira, 24 de outubro de 2014 14:07
    Moderador
  • Maxlei,

    Então, o Set XACT_Abort orienta o SQL Server é realizar um comportamento ao contrário durante a execução do bloco transact-sql em caso de falha.

    Se você esta fazendo uso desta instrução em conjunto com o Rollback, provavelmente o comportamento do SQL Server neste caso, será o contrário do Rollback somente se a sua instrução apresentar alguma erro de execução.

    Quando SET XACT_ABORT é ON, se uma instrução Transact-SQL gera um erro de tempo de execução, a transação inteira é encerrada e revertida.

    Quando SET XACT_ABORT é OFF, em alguns casos, somente a instrução Transact-SQL que gerou o erro é revertida e a transação continua a ser processada. Dependendo da gravidade do erro, a transação inteira pode ser revertida mesmo quando SET XACT_ABORT é OFF. OFF é a configuração padrão.


    Pedro Antonio Galvão Junior [MVP | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitário | SoroCódigos] @JuniorGalvaoMVP | pedrogalvaojunior.wordpress.com

    sexta-feira, 24 de outubro de 2014 18:28