Pular para o conteúdo
Visualizando 5 posts - 1 até 5 (de 5 do total)
  • Autor
    Posts
  • #101018
    Peterson
    Participante

      Boa tarde amigos.

      Tenho uma tabela que é preenchida por um formulário. Um determinado campo da tabela recebe sempre o valor ‘ ‘(dois espaços em branco).
      Criei um trigger para quando a tabela receber um INSERT ela copiar para esse campo o valor de um outro campo da mesma tabela que acabou de ser inserido.

      O trigger cria sem erros de compilação, porém ao executar dá a seguinte mensagem:

      ORA-04091: a tabela schema.tabela é mutante; talvez o gatilho/função não possa localizá-la.

      O banco é Oracle 10G 10.2.0.4 e o trigger segue abaixo.

      CREATE OR REPLACE TRIGGER TRG_AFTER_INS_SE3010
      AFTER INSERT ON se3010
      FOR EACH ROW WHEN (new.E3_FILORIG = ' ')
      BEGIN
      UPDATE se3010
      SET E3_FILORIG = E3_FILIAL
      WHERE R_E_C_N_O_ = :new.r_e_c_n_o_;
      END trg_after_ins_se3010;
      /

      Agradeço qualquer ajuda!

      #101019
      Ishii
      Participante

        Olá,

        Então… a atualização disparada por uma trigger na mesma tabela que está associada a trigger… isso é que causa o erro… table is mutanting…

        Você poderia utilizar o seguinte código (mas é melhor testar)

        CREATE OR REPLACE TRIGGER TRG_AFTER_INS_SE3010
        AFTER INSERT ON se3010
        FOR EACH ROW WHEN (new.E3_FILORIG = ' ')
        BEGIN
        :new.E3_FILORIG := :new.E3_FILIAL;
        END trg_after_ins_se3010;
        /

        Pois você está mudando um valor da mesma tabela na mesma linha…

        Se isso não der certo, vamos a opção dois que não recomendo mas se não tiver jeito….

        CREATE OR REPLACE TRIGGER TRG_AFTER_INS_SE3010
        AFTER INSERT ON se3010
        FOR EACH ROW WHEN (new.E3_FILORIG = ' ')
        PRAGMA AUTONOMOUS_TRANSACTION;
        BEGIN
        UPDATE se3010
        SET E3_FILORIG = E3_FILIAL
        WHERE R_E_C_N_O_ = :new.r_e_c_n_o_;
        END trg_after_ins_se3010;
        /

        []s Ishii

        #101020
        burga
        Participante

          Como o Ishii falou, a segunda opção que ele passou realmente não é boa. Se a primeira não der certo, o que acho difícil, tente com as três triggers apresentada nesse tópico pelo fsitja:

          https://www.profissionaloracle.com.br/modules.php?name=Forums&file=viewtopic&t=3834&start=0&postdays=0&postorder=asc&highlight=trigger

          Só faltou mudar uma coisa na primeira trigger do Ishii, ela deve ser BEFORE INSERT e não AFTER… [/code]

          #101022
          rman
          Participante

            @Peterson

            Não querendo semear a discórdia, mas por que tentar resolver isso no banco sendo que o problema está na aplicação ? Você está sem suporte da Microsiga ?

            Só acho que nesta situação você está assumindo responsabilidade que pode não ser sua…

            #101036
            Peterson
            Participante

              Ishii e burga!

              Funcionou a primeira sugestão do Ishii! Muito obrigado pela ajuda pessoal! Havia lido um material ontem sobre esse problema e desconfiei que se tratava de um problema de integridade na manipulação de dados sendo alterados na instrução.

              Rman,
              Concordo plenamente cara! Pelo menos serviu de aprendizagem para esse problema!

              Muito obrigado gente!

              abraços!

            Visualizando 5 posts - 1 até 5 (de 5 do total)
            • Você deve fazer login para responder a este tópico.
            plugins premium WordPress