Usuário com melhor resposta
Set xact_abort on gravando pela metade

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
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"- Editado Durval RamosModerator sexta-feira, 24 de outubro de 2014 15:31 Complemento de informações
- Sugerido como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:11
- Marcado como Resposta Durval RamosModerator segunda-feira, 5 de janeiro de 2015 22:10
-
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
- Sugerido como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:11
- Marcado como Resposta Durval RamosModerator segunda-feira, 5 de janeiro de 2015 22:10
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"- Editado Durval RamosModerator sexta-feira, 24 de outubro de 2014 15:31 Complemento de informações
- Sugerido como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:11
- Marcado como Resposta Durval RamosModerator segunda-feira, 5 de janeiro de 2015 22:10
-
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
- Sugerido como Resposta Durval RamosModerator terça-feira, 11 de novembro de 2014 01:11
- Marcado como Resposta Durval RamosModerator segunda-feira, 5 de janeiro de 2015 22:10