- Este tópico contém 4 respostas, 4 vozes e foi atualizado pela última vez 13 anos, 2 meses atrás por Peterson.
-
AutorPosts
-
27 de setembro de 2011 às 11:55 pm #101018PetersonParticipante
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!
28 de setembro de 2011 às 12:33 am #101019IshiiParticipanteOlá,
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
28 de setembro de 2011 às 1:04 am #101020burgaParticipanteComo 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]
28 de setembro de 2011 às 2:36 am #101022rmanParticipante@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…
28 de setembro de 2011 às 6:45 pm #101036PetersonParticipanteIshii 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!
-
AutorPosts
- Você deve fazer login para responder a este tópico.