Res: [oracle_br] Trigger mutanting

2009-11-26 Por tôpico Rejane Cristina Messias Correia
Oi Debora tenta colocar no declare o comando abaixo.


DECLARE
PRAGMA AUTONOMOUS_TRANSACTION;

Rejane.




De: Eduardo Souza 
Para: oracle_br@yahoogrupos.com.br
Enviadas: Quarta-feira, 25 de Novembro de 2009 14:09:06
Assunto: Re: [oracle_br] Trigger mutanting

Poderia enviar o código da solução adotada?

2009/11/25 Débora Acácio 

>
>
>
> Faz só um select e por isso estava dando erro.
>
> Fiz uma packege e alimentei duas variáveis pela trigger before... e na
> After eu valido com a package...
>
> Já está tudo ok
> Obrigada...
> Debby :)
>
>
> --- Em qua, 25/11/09, Eduardo 
> >
> escreveu:
>
> De: Eduardo >
> Assunto: Re: [oracle_br] Trigger mutanting
> Para: oracle_br@yahoogrupos.com.br 
> Data: Quarta-feira, 25 de Novembro de 2009, 11:53
>
>
> ela está alterando a tabela que a dispara?
>
> 2009/11/25 Débora Acácio 
> 
> >
>
> >
> >
> > Olá
> >
> > Estou tendo um problema numa trigger que estou alterando está dando
> > erro de trigger mutanting... alguém poderia me ajudar ?
> >
> > Grata
> >
> >
> > Debby :)
> >
> >
> >
> > __
> > Veja quais são os assuntos do momento no Yahoo! +Buscados
> > http://br.maisbuscados.yahoo.com
> >
> > [As partes desta mensagem que não continham texto foram removidas]
> >
> >
> >
>
> --
> --
>
> Eduardo
>
> [As partes desta mensagem que não continham texto foram removidas]
>
> 
>
> --
> >Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de
> inteira responsabilidade de seus remetentes.
> Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/
> --
> >Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure
> » Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE:
> http://www.oraclebr.com.br/
> -- Links do Yahoo!
> Grupos
>
> __
> Veja quais são os assuntos do momento no Yahoo! +Buscados
> http://br.maisbuscados.yahoo.com
>
> [As partes desta mensagem que não continham texto foram removidas]
>
>  
>


[As partes desta mensagem que não continham texto foram removidas]





--
>Atenção! As mensagens do grupo ORACLE_BR são de acesso público e de inteira 
>responsabilidade de seus remetentes.
Acesse: http://www.mail-archive.com/oracle_br@yahoogrupos.com.br/ 
--
>Apostilas » Dicas e Exemplos » Função » Mundo Oracle » Package » Procedure » 
>Scripts » Tutoriais - O GRUPO ORACLE_BR TEM SEU PROPRIO ESPAÇO! VISITE: 
>http://www.oraclebr.com.br/  

 Links do Yahoo! Grupos


  

Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com

[As partes desta mensagem que não continham texto foram removidas]



Res: RES: [oracle_br] Trigger mutanting

2009-11-25 Por tôpico Caio Spadafora
Ainda recomendaria o a utilização de uma transação autonoma.

O problema de trigger mutante tambem é propagado em referências cíclicas, para 
o caso em questão não vejo grandes problemas de utilizar a transação autonoma.

Atenciosamente,
Caio Spadafora.





De: Sérgio Luiz Rodrigues Chaves 
Para: oracle_br@yahoogrupos.com.br
Enviadas: Quarta-feira, 25 de Novembro de 2009 11:59:13
Assunto: RES: [oracle_br] Trigger mutanting

  
Debby,

Vou listar o procedimento básico para resolver esse problema:

1)   Tenho a tabela funcionário com a seguinte estrutura:

CREATE TABLE FUNC

(

CD_MATNUMBER(3) NOT NULL PRIMARY KEY,

NR_GITNUMBER(2),

VL_SALNUMBER(9,2)

2)   Tenho uma trigger para atualizar o salário do funcionário.

CREATE OR REPLACE TRIGGER checa_salario

BEFORE UPDATE OF vl_sal, nr_git ON FUNC

FOR EACH ROW WHEN (NEW.nr_git < 56)

DECLARE

salario_minimo   NUMBER(5) := 0;

salario_maximo   NUMBER(5) := 0;

faixaEXCEPTION;

negativo EXCEPTION;

BEGIN

SELECT MIN(vl_sal), Max(vl_sal)

INTO salario_minimo, salario_maximo

FROM FUNC

WHERE nr_git = :new.nr_git;

IF (:NEW.vl_sal < salario_minimo OR

:NEW.vl_sal > salario_maximo) THEN

RAISE faixa;

ELSIF (:NEW.VL_SAL < :OLD.vl_sal) THEN

RAISE negativo;

END IF;

EXCEPTION

WHEN faixa THEN

RAISE_APPLICATION_ ERROR (-20225, 'Salário fora da faixa');

WHEN negativo THEN

RAISE_APPLICATION_ ERROR (-20230, 'Incremento negativo');

END;

Que quando executo dá erro de "multante", pois estou realizando uma consulta na 
mesma tabela que estou atualizando.

3)   Resolvendo.. .. Criei uma tabela temporária com a mesma estrutura de 
FUNC de nome TFUNC_MUT.

DROP TABLE TFUNC_MUT;

CREATE TABLE TFUNC_MUT

(

CD_MATNUMBER(3) NOT NULL PRIMARY KEY,

NR_GITNUMBER(2),

VL_SALNUMBER(9,2),

NR_ORDEM  NUMBER,--- nova coluna

STATUSVARCHAR2(10) --- nova coluna

)

DROP SEQUENCE ORDEM

/

CREATE SEQUENCE ORDEM

ORDER

START WITH 1

NOCYCLE

/

4)   Recrio a trigger gravando na tabela temporária

CREATE OR REPLACE TRIGGER checa_salario

BEFORE UPDATE OF vl_sal, nr_git ON FUNC

FOR EACH ROW WHEN (NEW.nr_git < 56)

DECLARE

salario_minimo   NUMBER(5) := 0;

salario_maximo   NUMBER(5) := 0;

qtd  NUMBER;

negativo EXCEPTION;

BEGIN

IF (:NEW.VL_SAL < :OLD.vl_sal) THEN

RAISE negativo;

ELSE

SELECT COUNT(*) INTO qtd FROM tfunc_mut

where cd_mat = :new.cd_mat;

IF qtd = 0 THEN

INSERT INTO TFUNC_MUT (cd_mat, vl_sal, nr_git, nr_ordem, status)

VALUES (:NEW.cd_mat, :NEW.vl_sal, :NEW.nr_git,

ordem.nextval, 'VALID');

:NEW.vl_sal := :OLD.vl_sal;

end if;

END IF;

EXCEPTION

WHEN negativo THEN

RAISE_APPLICATION_ ERROR (-20230, 'Incremento negativo');

END; 

5)   Crio nova trigger 

CREATE OR REPLACE TRIGGER checa_salario_ mut

AFTER UPDATE OF vl_sal, nr_git ON FUNC

DECLARE

cursor wc is SELECT * FROM tfunc_mut

WHERE status = 'VALID'

ORDER BY NR_ORDEM

FOR UPDATE;

salario_minimo   NUMBER(5) := 0;

salario_maximo   NUMBER(5) := 0;

faixaEXCEPTION;

TYPE TIPO_MUT IS TABLE OF TFUNC_MUT%ROWTYPE

INDEX BY BINARY_INTEGER;

TABMUT   TIPO_MUT;

I   NUMBER := 0;

BEGIN

FOR wr IN wc LOOP

SELECT MIN(vl_sal), MAX(vl_sal)

INTO salario_minimo, salario_maximo

FROM func

WHERE nr_git = wr.nr_git;

IF wr.vl_sal < salario_minimo OR

wr.vl_sal > salario_maximo THEN

RAISE faixa;

ELSE

I := I + 1;

TABMUT(I) := WR;

UPDATE tfunc_mut SET status = 'INVALID';

END IF;

END LOOP;

FOR J IN 1..I LOOP

UPDATE func SET vl_sal = TABMUT(J).vl_ sal,

nr_git = TABMUT(J).nr_ git

WHERE cd_mat = TABMUT(J).cd_ mat;

END LOOP;

IF I > 0 THEN

DELETE FROM tfunc_mut;

END IF;

EXCEPTION

WHEN faixa THEN

DELETE FROM tfunc_mut;

RAISE_APPLICATION_ ERROR (-20230, 'Salário fora da faixa');

END;

/

Verifique se os códigos acima lhe ajudam para resolver seu problema.

Boa sorte.

Atenciosamente, Sérgio Chaves. 

 _ _ __

De: oracle...@yahoogrup os.com.br [mailto:oracle...@yahoogrup os.com.br] Em 
nome de Sergio Lucchini
Enviada em: quarta-feira, 25 de novembro de 2009 10:58
Para: oracle...@yahoogrup os.com.br
Assunto: RES: [oracle_br] Trigger mutanting

Isso ocorre quando vc precisa acessa a tabela onde esta a trigger. Vc pode 
declarar a sua trigger como Pragma Autonomous_Transact ion para eliminar esse 
erro.

Exemplo:

CREATE OR REPLACE TRIGGER nome_trigger AFTER UPDATE
ON nome_tabela REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE

Pragma Autonomous_Transact ion;

BEGIN


Sergio Lucchini

 _ _ __
De: oracle...@yahoogrup os.com.br <mailto:oracle_ br%40yahoogrupos .com.br>  
[mailto:oracle...@yahoogrup os.com.br <mailto:oracle_ br%40yahoogrupos .com.br> 
] Em nom

RES: [oracle_br] Trigger mutanting

2009-11-25 Por tôpico Sérgio Luiz Rodrigues Chaves
Debby,

 

Vou listar o procedimento básico para resolver esse problema:

 

1)   Tenho a tabela funcionário com a seguinte estrutura:

CREATE TABLE FUNC

(

 CD_MATNUMBER(3) NOT NULL PRIMARY KEY,

 NR_GITNUMBER(2),

 VL_SALNUMBER(9,2)

2)   Tenho uma trigger para atualizar o salário do funcionário.

CREATE OR REPLACE TRIGGER checa_salario

BEFORE UPDATE OF vl_sal, nr_git ON FUNC

FOR EACH ROW WHEN (NEW.nr_git < 56)

DECLARE

  salario_minimo   NUMBER(5) := 0;

  salario_maximo   NUMBER(5) := 0;

  faixaEXCEPTION;

  negativo EXCEPTION;

BEGIN

  SELECT MIN(vl_sal), Max(vl_sal)

   INTO salario_minimo, salario_maximo

  FROM FUNC

  WHERE nr_git = :new.nr_git;

  IF (:NEW.vl_sal < salario_minimo OR

  :NEW.vl_sal > salario_maximo) THEN

 RAISE faixa;

  ELSIF (:NEW.VL_SAL < :OLD.vl_sal) THEN

 RAISE negativo;

  END IF;

EXCEPTION

  WHEN faixa THEN

RAISE_APPLICATION_ERROR (-20225, 'Salário fora da faixa');

  WHEN negativo THEN

RAISE_APPLICATION_ERROR (-20230, 'Incremento negativo');

END;

 

Que quando executo dá erro de "multante", pois estou realizando uma consulta na 
mesma tabela que estou atualizando.

 

3)   Resolvendo Criei uma tabela temporária com a mesma estrutura de 
FUNC de nome TFUNC_MUT.

 

DROP TABLE TFUNC_MUT;

CREATE TABLE TFUNC_MUT

(

 CD_MATNUMBER(3) NOT NULL PRIMARY KEY,

 NR_GITNUMBER(2),

 VL_SALNUMBER(9,2),

 NR_ORDEM  NUMBER,--- nova coluna

 STATUSVARCHAR2(10) --- nova coluna

)

DROP SEQUENCE ORDEM

/

CREATE SEQUENCE ORDEM

ORDER

START WITH 1

NOCYCLE

/

4)   Recrio a trigger gravando na tabela temporária

 

CREATE OR REPLACE TRIGGER checa_salario

BEFORE UPDATE OF vl_sal, nr_git ON FUNC

FOR EACH ROW WHEN (NEW.nr_git < 56)

DECLARE

  salario_minimo   NUMBER(5) := 0;

  salario_maximo   NUMBER(5) := 0;

  qtd  NUMBER;

  negativo EXCEPTION;

BEGIN

  IF (:NEW.VL_SAL < :OLD.vl_sal) THEN

 RAISE negativo;

  ELSE

 SELECT COUNT(*) INTO qtd FROM tfunc_mut

   where cd_mat = :new.cd_mat;

 IF qtd = 0 THEN

INSERT INTO TFUNC_MUT (cd_mat, vl_sal, nr_git, nr_ordem, status)

  VALUES (:NEW.cd_mat,:NEW.vl_sal,:NEW.nr_git,

  ordem.nextval, 'VALID');

:NEW.vl_sal := :OLD.vl_sal;

 end if;

  END IF;

EXCEPTION

  WHEN negativo THEN

RAISE_APPLICATION_ERROR (-20230, 'Incremento negativo');

END; 

 

5)   Crio nova trigger  

 

CREATE OR REPLACE TRIGGER checa_salario_mut

AFTER UPDATE OF vl_sal, nr_git ON FUNC

DECLARE

  cursor wc is SELECT * FROM tfunc_mut

   WHERE status = 'VALID'

   ORDER BY NR_ORDEM

   FOR UPDATE;

  salario_minimo   NUMBER(5) := 0;

  salario_maximo   NUMBER(5) := 0;

  faixaEXCEPTION;

  TYPE TIPO_MUT IS TABLE OF TFUNC_MUT%ROWTYPE

   INDEX BY BINARY_INTEGER;

  TABMUT   TIPO_MUT;

  I   NUMBER := 0;

BEGIN

  FOR wr IN wc LOOP

SELECT MIN(vl_sal), MAX(vl_sal)

  INTO salario_minimo, salario_maximo

  FROM func

 WHERE nr_git = wr.nr_git;

 IF wr.vl_sal < salario_minimo OR

wr.vl_sal > salario_maximo THEN

RAISE faixa;

 ELSE

I := I + 1;

TABMUT(I) := WR;

UPDATE tfunc_mut SET status = 'INVALID';

 END IF;

  END LOOP;

  FOR J IN 1..I LOOP

  UPDATE func SET vl_sal = TABMUT(J).vl_sal,

  nr_git = TABMUT(J).nr_git

 WHERE cd_mat = TABMUT(J).cd_mat;

  END LOOP;

  IF I > 0 THEN

 DELETE FROM tfunc_mut;

  END IF;

EXCEPTION

  WHEN faixa THEN

DELETE FROM tfunc_mut;

RAISE_APPLICATION_ERROR (-20230, 'Salário fora da faixa');

END;

/

 

 

 

Verifique se os códigos acima lhe ajudam para resolver seu problema.

 

Boa sorte.

 

Atenciosamente, Sérgio Chaves. 





 



De: oracle_br@yahoogrupos.com.br [mailto:oracle...@yahoogrupos.com.br] Em nome 
de Sergio Lucchini
Enviada em: quarta-feira, 25 de novembro de 2009 10:58
Para: oracle_br@yahoogrupos.com.br
Assunto: RES: [oracle_br] Trigger mutanting

 

  

Isso ocorre quando vc precisa acessa a tabela onde esta a trigger. Vc pode 
declarar a sua trigger como Pragma Autonomous_Transaction para eliminar esse 
erro.

Exemplo:

CREATE OR REPLACE TRIGGER nome_trigger AFTER UPDATE
ON nome_tabela REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE

Pragma Autonomous_Transaction;

BEGIN


Sergio Lucchini


De: oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br>  
[mailto:oracle_br@yahoogrupos.com.br <mailto:oracle_br%40yahoogrupos.com.br> ] 
Em nome de Débora Acácio
Enviada em: quarta-feira, 25 de novembro de 

RES: [oracle_br] Trigger mutanting

2009-11-25 Por tôpico Sergio Lucchini
Isso ocorre quando vc precisa acessa a tabela onde esta a trigger. Vc pode 
declarar a sua trigger como Pragma Autonomous_Transaction para eliminar esse 
erro.

Exemplo:

CREATE OR REPLACE TRIGGER nome_trigger AFTER UPDATE
ON nome_tabela REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
DECLARE

Pragma Autonomous_Transaction;

BEGIN



Sergio Lucchini


De: oracle_br@yahoogrupos.com.br [mailto:oracle...@yahoogrupos.com.br] Em nome 
de Débora Acácio
Enviada em: quarta-feira, 25 de novembro de 2009 09:41
Para: Grp Oracle
Assunto: [oracle_br] Trigger mutanting



Olá

Estou tendo um problema numa trigger que estou alterando está dando erro de 
trigger mutanting... alguém poderia me ajudar ?

Grata


Debby :)



__
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbuscados.yahoo.com

[As partes desta mensagem que não continham texto foram removidas]


No virus found in this incoming message.
Checked by AVG - www.avg.com
Version: 8.5.423 / Virus Database: 270.14.81/2524 - Release Date: 11/24/09 
19:37:00


[As partes desta mensagem que não continham texto foram removidas]



RES: [oracle_br] Trigger mutanting

2009-11-25 Por tôpico Valtemir Araujo de Lima
vc pode criar uma package para resolver o problema:
 
na primeira trigger:
create or replace trigger NOMETRIGGER_1
   after  insert or update or delete
 on NOMETABELA
   for each row
declare
   ..
begin
   if :new.atributo = ...
  PACOTE_PKG.VARIAVEL :=  X  usar a variavel de uma package para
guardar seu conteudo para fazer select na mesma tabela da trigger
   .
end;
 
 
 
 
na package
create or replace package  PACOTE_PKG as 
   VARIAVELnumber(10);
end;
 
 
 
 
na segunda trigger  de sua tabela
create or replace trigger NOMETRIGGER_1
   after insert or update or delete on NOMETABELA
declare
   
Begin
   if  PACOTE_PKG.VARIAVEL  is not null then
  select ... --pode fazer select na mesma tabela da primeira trigger
  from NOMETABELA
  where coluna = PACOTE_PKG.VARIAVEL  
  end if;
end;
 
 
 
 

-Mensagem original-
De: Débora Acácio [mailto:debby_ora...@yahoo.com.br]
Enviada em: 25 de novembro de 2009 08:41
Para: Grp Oracle
Assunto: [oracle_br] Trigger mutanting


  

Olá
 
Estou tendo um problema numa trigger que estou alterando está dando erro
de trigger mutanting... alguém poderia me ajudar ?
 
Grata
 
 
Debby :)
 
 

__
Veja quais são os assuntos do momento no Yahoo! +Buscados
http://br.maisbusca  dos.yahoo.com

[As partes desta mensagem que não continham texto foram removidas]