locked
Erro em job, porém não no Query Analyzer RRS feed

  • Pergunta

  • Bom dia,

    Tenho um processo que executa uma carga todos os dias. Via job, quando encontra o primeiro erro (erro de FK) o job falha e aborta, se eu executar a mesma chamada da procedure q está no job via Query Analyzer (é um SQL Server 2000 SP4 Enterprise Edition x86), ocorrem os erros mas o processo finaliza.

    Alguém já passou por algo parecido ou pode me explicar pq a diferença se via job ou via query o comando executado é o mesmo?

    Obrigado.

    segunda-feira, 14 de novembro de 2011 11:25

Respostas

  • Ronald, a tratativa de erros dentro de uma transação depende de quais opções foram configuradas no escopo da sua sessão. Você pode configurar sua sessão para fazer rollback das transações quando um erro acontece em qualquer comando, ou para continuar as transações até o fim, mesmo ocorrendo um erro.

    No seu caso, certamente há diferenças nas opções configuradas no escopo da sessão quando a transação é executada pelo SQL Server Agent e quando é executada pelo Query Analyzer.

    Abra o Query Analyzer, e em uma nova sessão execute:

    SET XACT_ABORT ON
    BEGIN TRAN
    PRINT 'Dividindo por zero'
    SELECT 1/0
    PRINT 'Divisão por zero não causou rollback na transação'
    COMMIT TRAN

    A mensagem 'Divisão por zero não causou rollback na transação' não será exibida. Abra uma nova sessão e execute:

    SET XACT_ABORT OFF
    BEGIN TRAN
    PRINT 'Dividindo por zero'
    SELECT 1/0
    PRINT 'Divisão por zero não causou rollback na transação'
    COMMIT TRAN
    


    Desta vez, a mensagem 'Divisão por zero não causou rollback na transação' será exibida, pois a transação continuou até o fim, mesmo ocorrendo um erro na instrução "SELECT 1/0"

    A diferença entre uma execução e outra é que a opção XACT_ABORT foi configurada na sessão, antes da transação ser iniciada. Para mais detalhes, leia este conteúdo: http://msdn.microsoft.com/pt-br/library/ms188792.aspx

    O que você deve fazer é adicionar a instrução "SET XACT_ABORT ON" dentro de sua procedure, antes de iniciar sua transação, para que qualquer erro que ocorra dentro desta transação cause um rollback. Desta forma, não importa de onde você irá executar esta procedure, o comportamento quanto a tratativa de erros será a mesma.

    Posso colaborar mais se ainda tiver dúvidas. Caso minha resposta tenha atendido sua necessidade, por favor marque-a como correta.

    Boa sorte e bom ano novo!



    segunda-feira, 2 de janeiro de 2012 22:43

Todas as Respostas

  • Ronald,

     

    Dentro de sua procedure existe alguma tratativa para erros?

    Qual é a descrição exata do erro pelo job?

    E quando voce  executa na mão, apesar de dar erro e não parar, o que acontece com o erro? simplismente é ignorado?


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    segunda-feira, 14 de novembro de 2011 11:35
    Moderador
  • Oi Fabrizzio,

    Não possui tratamento de erros, apenas prints a cada comando. No job quando é encontrado o primeiro erro em uma inserção referente a uma FK, o job aborta, para...já via QA o processo continua executando...mesmo exibindo os erros via print.

    Obrigado.

    segunda-feira, 14 de novembro de 2011 11:52
  • Ronaldo,

     

    Estranho, pois o SQL Server agent é apenas um carinha que inicia alguma coisa de forma automatica, portanto, em 99% das vezes, sua unica diferença seria problema de permissão, que é no seu caso, o que eu recomendaria:

    Voce disse que apenas da um print, ok, porem, pelo job, ele não deve estar verificando e tentando inserir, executando manualmente, ele esta verificando, então:

    - Verifique a default language do usuario do Agent e do seu usuario (Caso a verificação de inserção seja por data, pode fazer diferença)

    - Execute via job executando um profiler por traz, e veja se ele esta caindo no if de verificação de inserção ou não.


    Fabrizzio A. Caputo
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    segunda-feira, 14 de novembro de 2011 11:55
    Moderador
  • Fabrizzio,

    Não existem ifs na procedure.

    O collation e o default language do usuário q executa o job estão iguais...o owner do job é o sa...e o SQL Agent executa com uma conta de domínio q é sysadmin...

    segunda-feira, 14 de novembro de 2011 12:34
  • Ronald,

     

    Seu JOB tem quantas Steps?

    Se tem mais de uma, você configurou nas propriedades do JOB, para a etapa continuar, ou seja, ir para a próxima etapa, mesmo que haja falha na etapa corrente?

    Tem como você postar exatamente a mesagem de erro que ocorre nas duas formas de execução do script (via JOB ou via QA)?

     


    Att, Alan Roberto Analista de Sistemas
    sexta-feira, 25 de novembro de 2011 18:51
  • Oi Alan

    ,

    Tem apenas um passo

    , a execuo de uma procedure que chama outras que vo fazendo a carga de vrias tabelas.

    O

    SQL um 2000 SP4.

    O problema um erro de

    constraint, veja:

    Msg 547

    , Sev 16: INSERT statement conflicted with COLUMN FOREIGN KEY constraint 'FK_XXX'. The conflict occurred in database 'DBXXX', table 'TBXXX', column 'XXXX'. [SQLSTATE 23000]

    Msg 0

    , Sev 16: 000001#5058 [SQLSTATE 01000]

    Msg 0

    , Sev 16: 000001 [SQLSTATE 01000]

    Msg 3621

    , Sev 16: The statement has been terminated. [SQLSTATE 01000]

    O comportamento estranho que a carga vai sendo executada normalmente

    , at que chegue neste erro, a o job aborta, porm se eu abrir o query analyzer e der um exec na proc que possui vrios PRINTS,

    este erro vai acontecer

    , porm a carga no ser interrompida e ir at o final.

    Preciso fazer aque o job tenha o mesmo comportamento enquanto o fornecedor no resolve o problema da

    constraint.

    Obrigado

    .
    quinta-feira, 1 de dezembro de 2011 11:49
  • Ronald, a tratativa de erros dentro de uma transação depende de quais opções foram configuradas no escopo da sua sessão. Você pode configurar sua sessão para fazer rollback das transações quando um erro acontece em qualquer comando, ou para continuar as transações até o fim, mesmo ocorrendo um erro.

    No seu caso, certamente há diferenças nas opções configuradas no escopo da sessão quando a transação é executada pelo SQL Server Agent e quando é executada pelo Query Analyzer.

    Abra o Query Analyzer, e em uma nova sessão execute:

    SET XACT_ABORT ON
    BEGIN TRAN
    PRINT 'Dividindo por zero'
    SELECT 1/0
    PRINT 'Divisão por zero não causou rollback na transação'
    COMMIT TRAN

    A mensagem 'Divisão por zero não causou rollback na transação' não será exibida. Abra uma nova sessão e execute:

    SET XACT_ABORT OFF
    BEGIN TRAN
    PRINT 'Dividindo por zero'
    SELECT 1/0
    PRINT 'Divisão por zero não causou rollback na transação'
    COMMIT TRAN
    


    Desta vez, a mensagem 'Divisão por zero não causou rollback na transação' será exibida, pois a transação continuou até o fim, mesmo ocorrendo um erro na instrução "SELECT 1/0"

    A diferença entre uma execução e outra é que a opção XACT_ABORT foi configurada na sessão, antes da transação ser iniciada. Para mais detalhes, leia este conteúdo: http://msdn.microsoft.com/pt-br/library/ms188792.aspx

    O que você deve fazer é adicionar a instrução "SET XACT_ABORT ON" dentro de sua procedure, antes de iniciar sua transação, para que qualquer erro que ocorra dentro desta transação cause um rollback. Desta forma, não importa de onde você irá executar esta procedure, o comportamento quanto a tratativa de erros será a mesma.

    Posso colaborar mais se ainda tiver dúvidas. Caso minha resposta tenha atendido sua necessidade, por favor marque-a como correta.

    Boa sorte e bom ano novo!



    segunda-feira, 2 de janeiro de 2012 22:43
  • Este post foi encerrado por ser considerado um post antigo.

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

    terça-feira, 5 de junho de 2018 18:35
    Moderador