Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Nadia Teles

Problema com trigger

Recommended Posts

Boa tarde Pessoal,

 

Tenho uma trigger com o seguinte cabeçalho:

 

CREATE OR REPLACE TRIGGER "TESTE"."TESTE_INTEGRACAO" BEFORE

INSERT ON "TABELA" FOR EACH ROW DECLARE

 

Quando um registro é inserido, preciso validar alguns campos. Veja as duas situações:

 

1- Se um campo obrigatorio não estiver preenchido, no final eu tenho que fazer um update neste registro que foi inserido;

 

2- Se tudo estiver correto a trigger é processada e no final eu tenho que apagar este registro que foi inserido;

 

Já inseri o comando que trata de tabela mutante (Pragma Autonomous_Transaction). Não dá nenhum erro, mas o problema é que o update e delete não funcionam.

 

Um detalhe importante: Quando insiro o segundo registro, ele atualiza ou deleta o registro anterior e não o que foi inserido.

 

Alguém pode me ajudar?

 

Nádia

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi :

 

Você quer mudar ou validar campos num insert.

 

Após um insert você quer deletar este registro ?!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não entendi :

 

Você quer mudar ou validar campos num insert.

 

Após um insert você quer deletar este registro ?!

 

É o seguinte:

 

Um registro é inserido na tabela, a trigger é disparada alimentando outras tabelas do banco. Até aqui está tudo funcionando.

 

No final da trigger preciso implementar o seguinte:

 

1- Se um campo obrigatório não foi preenchido no insert, a trigger não será processada corretamente, neste caso preciso fazer um update neste registro que foi inserido.

 

1- Se os campos estiverem tudo certo, a trigger será processada. Neste caso, preciso deletar este registro que foi inserido.

 

Ex.

 

if (erro) then

update

end if;

 

if (não erro) then

update

end if;

 

O oracle permite fazer update/delete neste registro que foi inserido e está sendo tratado pela trigger?

 

OBS. No primeiro insert, nada acontece, no segundo ele atualiza/deleta o primeiro registro, onde deveria atualizar/deletar o proprio registro inserido. A impressão que tenho é que o update e delete não podem ser utilizados no registro que está sendo tratado pela trigger.

 

Como resolver?

 

Obrigada

 

Nádia

Compartilhar este post


Link para o post
Compartilhar em outros sites

O oracle permite fazer update/delete neste registro que foi inserido e está sendo tratado pela trigger?

 

Não sei bem o que você quer , para um campo não preenchido pode-se criar um valor default no campo

 

ALTER TABLE TABELA MODIFY CAMPO VARCHAR(3) DEFAULT 'ABC';

 

Sendo um pouco mais cmplexo , pode ser alimentado na trigger

 

CREATE OR REPLACE TRIGGER ....

 

IF :NEW.CAMPO IS NULL THEN

SELECT CAMPO2 INTO //;NEW.CAMPO FROM TABELA2 WHERE ....;

END IF;

 

deletar o mesmo registro não faz sentido, pode-se , criar uma exceção ou

criar uma triger de INSTEND OF (não estou certo se se escreve assim),

este tipo de TRIGGER é executado "ao ínvez de" de executar o comando de DELETE (por exemplo).

 

Espero ter ajudado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O oracle permite fazer update/delete neste registro que foi inserido e está sendo tratado pela trigger?

 

Não sei bem o que você quer , para um campo não preenchido pode-se criar um valor default no campo

 

ALTER TABLE TABELA MODIFY CAMPO VARCHAR(3) DEFAULT 'ABC';

 

Sendo um pouco mais cmplexo , pode ser alimentado na trigger

 

CREATE OR REPLACE TRIGGER ....

 

IF :NEW.CAMPO IS NULL THEN

SELECT CAMPO2 INTO //;NEW.CAMPO FROM TABELA2 WHERE ....;

END IF;

 

deletar o mesmo registro não faz sentido, pode-se , criar uma exceção ou

criar uma triger de INSTEND OF (não estou certo se se escreve assim),

este tipo de TRIGGER é executado "ao ínvez de" de executar o comando de DELETE (por exemplo).

 

Espero ter ajudado.

 

Me ajude a fazer funcionar este trigger:

 

---------------------------------------------------------------------------

CRIA TABELA

---------------------------------------------------------------------------

 

CREATE TABLE "TESTE"."TESTEA" ("TESTE1" VARCHAR2(10 byte) NOT

NULL, "TESTE2" VARCHAR2(10 byte) NOT NULL)

TABLESPACE "TESTE" PCTFREE 10 PCTUSED 0 INITRANS 1 MAXTRANS

255

STORAGE ( INITIAL 64K NEXT 0K MINEXTENTS 1 MAXEXTENTS

2147483645 PCTINCREASE 0)

LOGGING

 

 

---------------------------------------------------------------------------

CRIA TRIGGER

---------------------------------------------------------------------------

 

CREATE OR REPLACE TRIGGER "TESTE"."TESTE_TRIGGER" AFTER

INSERT ON "TESTEA" FOR EACH ROW

 

Declare

 

---------------------------------------

-- Linha que elimina o erro MUTATING --

 

Pragma Autonomous_Transaction;

---------------------------

 

sTESTE1 VARCHAR(10);

sTESTE2 VARCHAR(10);

 

Begin

 

sTESTE1 := :New.TESTE1;

sTESTE2 := :New.TESTE2;

 

--ALTERA

 

IF (sTESTE2 IS NULL) THEN

--atualiza este registro

update TESTEA set sTESTE2 = 'oi';

END IF;

 

--DELETA

 

IF (sTESTE1 <> ' ' AND sTESTE2 <> ' ') THEN

--delete este registro

delete from TESTEA where (sTESTE1 <> ' ' and sTESTE2 <> ' ') ;

END IF;

 

COMMIT;

 

End;

 

--------------------------------------------------------------

--INSERT

--------------------------------------------------------------

--FAÇA OS INSERTS ABAIXO, UM DE CADA VEZ

 

INSERT INTO TESTEA(TESTE1, TESTE2) VALUES( '1' , '2' );

INSERT INTO TESTEA(TESTE1, TESTE2) VALUES( '3' , '4' );

 

QUANDO VOCÊ FAZ O PRIMEIRO INSERT, ELE PERMANECE NA TABELA E NÃO É DELETADO

QUANDO VOCÊ FAZ O SEGUNDO INSERT, ELE DELETA O PRIMEIRO

 

Preciso deletar o proprio registro que está sendo inserido. A mesma coisa deve ser para alteração. Alterar o que está sendo inserido.

 

Obrigada

 

Nádia

Compartilhar este post


Link para o post
Compartilhar em outros sites

CREATE OR REPLACE TRIGGER "TESTE"."TESTE_TRIGGER" AFTER

INSERT ON "TESTEA" FOR EACH ROW

 

Declare

 

---------------------------------------

-- Linha que elimina o erro MUTATING --

 

--Pragma Autonomous_Transaction;

---------------------------

 

sTESTE1 VARCHAR(10);

sTESTE2 VARCHAR(10);

 

Begin

 

sTESTE1 := :New.TESTE1;

sTESTE2 := :New.TESTE2;

 

--ALTERA

 

IF (:New.TESTE1 IS NULL) THEN

--atualiza este registro

:New.TESTE1 := 'oi';

END IF;

 

--"DELETA"

 

IF (:New.TESTE1 is not null AND is not null THEN

--não grava este registro

raise_application_error(-20001,'valores invalidos !!');

END IF;

 

COMMIT;

 

End;

Compartilhar este post


Link para o post
Compartilhar em outros sites

CREATE OR REPLACE TRIGGER "TESTE"."TESTE_TRIGGER" AFTER

INSERT ON "TESTEA" FOR EACH ROW

 

Declare

 

---------------------------------------

-- Linha que elimina o erro MUTATING --

 

--Pragma Autonomous_Transaction;

---------------------------

 

sTESTE1 VARCHAR(10);

sTESTE2 VARCHAR(10);

 

Begin

 

sTESTE1 := :New.TESTE1;

sTESTE2 := :New.TESTE2;

 

--ALTERA

 

IF (:New.TESTE1 IS NULL) THEN

--atualiza este registro

:New.TESTE1 := 'oi';

END IF;

 

--"DELETA"

 

IF (:New.TESTE1 is not null AND is not null THEN

--não grava este registro

raise_application_error(-20001,'valores invalidos !!');

END IF;

 

COMMIT;

 

End;

 

Bom dia,

 

Estou com duas pequenas dúvidas.

 

1-) Não consigo fazer o update de um segundo campo. Por Exemplo.

 

IF (:New.TESTE1 IS NULL) THEN

--atualiza este registro

:New.TESTE1 := 1; --Campo numerico

:New.TESTE3 := 'oi'; --Campo varchar(50)

END IF;

 

:New.TESTE1 := 1; -- Este funciona.

:New.TESTE3 := 'oi'; Quando insiro esta linha da erro no oracle (ora-03113 - Fim de comunicação). Se retirar funciona. O que está errado? Já tentei de todos os jeitos.

 

2-) A trigger é Before Insert e não After Insert como mencionado acima. Preciso deletar este registro que será inserido ou apenas não inseri-lo. Como faço?

 

IF (:New.TESTE1 is not null AND TESTE2 is not null) THEN

--não grava este registro ou deleta este registro

Qual comando devo utilizar aqui, pois o delete não funciona.

 

END IF;

 

 

Obrigada.

 

Nádia

Compartilhar este post


Link para o post
Compartilhar em outros sites

1) deve haver alguma constraint na campo que dá erro quando é atualizado, atribuir valor a um campo só pode ser feita em triggers de befero insert e for each row.

 

2) Não entendo a lõgica de se deletar o registro que está sendo inserido, se me permite a piada é trancar a gaveta com a chave dentro.Para se não gravar o registro pode-se gerar um erro como no exemplo que te passei.

 

Outro exemplo :

 

CREATE OR REPLACE TRIGGER VALIDA_CLIENTE

AFTER INSERT IN ....

...

IF :NEW.DATA_NASCIMENTO < (SYSDATE - (365 * 120)) THEN

RAISE_APPLICATION_ERROR(-20001,'CLIENTE VELHO DEMAIS !!!')

END IF:

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.