Ir para conteúdo

POWERED BY:

Arquivado

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

Gustavo La Rubia Clepardi

[Resolvido] Problemas com Trigger

Recommended Posts

Pessoal,

 

Preciso da ajuda de voces...

 

Existe uma tabela OFI_FICHA_PROPRIETARIO

E eu queria registrar na tabela AUX_FICHA_PROPRIETARIO

Todas as movimentações que a tabela OFI_FICHA_PROPRIETARIO teve...

 

Se Incluiu um registro, Se alterou um registro.

Se deletou, preciso saber qual é o registro que está deletando e no campo: PROPRIETARIO_ATUAL, setar como ‘N’.

 

Segue a estrurura das tabelas:

 

CREATE
   TABLE AUX_FICHA_PROPRIETARIO
   (
       CHASSI VARCHAR2(17) NOT NULL,
       CLIENTE NUMBER(6) NOT NULL,
       DTA_ALTERACAO DATE NOT NULL,
       PROPRIETARIO_ATUAL VARCHAR2(1) NOT NULL,
       DTA_AQUISICAO DATE NOT NULL
   )

 

CREATE
   TABLE OFI_FICHA_PROPRIETARIO
   (
       CHASSI VARCHAR2(17) NOT NULL,
       CLIENTE NUMBER(6) NOT NULL,
       VENDEDOR VARCHAR2(50),
       REVENDA VARCHAR2(50),
       CEP_REVENDA NUMBER(8),
       DTA_AQUISICAO DATE,
       DTA_VEN_SEGURO DATE,
       DTA_VEN_LICENCIAMENT DATE,
       PERIODICIDADE_TROCA NUMBER(2),
       DTA_VENDA DATE,
       PRAZO_FINANCIAMENTO NUMBER(2),
       USUARIO_VEICULO VARCHAR2(1) NOT NULL,
       NOME_USUARIO VARCHAR2(40) NOT NULL,
       PROPRIETARIO_ATUAL VARCHAR2(1) NOT NULL,
       DTA_PROXIMO_IPVA DATE,
       ENVIADO_H3S CHAR(1),
       CLIENTE_REVENDA NUMBER(6),
       CONSTRAINT OFIPROPFIC_PK PRIMARY KEY (CHASSI, CLIENTE),
       CONSTRAINT OFIPROPFIC_OFIFICHA_FK FOREIGN KEY (CHASSI) REFERENCES OFI_FICHA_SEGUIMENTO (
       CHASSI),
       CONSTRAINT OFIPROPFIC_FATCEP_FK FOREIGN KEY (CEP_REVENDA) REFERENCES FAT_CEP (CEP),
       CONSTRAINT OFIPROPFIC_FATCLIENTE_FK FOREIGN KEY (CLIENTE) REFERENCES FAT_CLIENTE (CLIENTE),
       CONSTRAINT OFIPROPFIC_FATCLIE_FK FOREIGN KEY (CLIENTE_REVENDA) REFERENCES FAT_CLIENTE (
       CLIENTE),
       CONSTRAINT AVCON_1143728417_PROPR_000 CHECK (PROPRIETARIO_ATUAL IN ('N', 'S')),
       CONSTRAINT AVCON_1143728417_USUAR_000 CHECK (USUARIO_VEICULO IN ('E', 'F', 'O', 'P')),
       CONSTRAINT OFIFIC_ENVH3S_CK CHECK (ENVIADO_H3S IN ('S','N'))
   );

Compartilhar este post


Link para o post
Compartilhar em outros sites
CREATE OR REPLACE TRIGGER TRG_FICHA_PROPRIETARIO
BEFORE
INSERT OR DELETE OR UPDATE
ON OFI_FICHA_PROPRIETARIO
FOR EACH ROW
BEGIN
IF INSERTING OR UPDATING THEN
INSERT INTO AUX_FICHA_PROPRIETARIO (CHASSI,
CLIENTE,
DTA_ALTERACAO,
PROPRIETARIO_ATUAL,
DTA_AQUISICAO)
VALUES (NEW.CHASSI,
NEW.CLIENTE,
SYSDATE,
NEW.PROPRIETARIO_ATUAL,
NEW.DTA_AQUISICAO
)
ELSIF DELETING THEN
INSERT INTO AUX_FICHA_PROPRIETARIO (CHASSI,
CLIENTE,
DTA_ALTERACAO,
PROPRIETARIO_ATUAL,
DTA_AQUISICAO)
VALUES (OLD.CHASSI,
OLD.CLIENTE,
SYSDATE,
'N',
OLD.DTA_AQUISICAO
)
END IF
END

Compartilhar este post


Link para o post
Compartilhar em outros sites

Troque NEW. por :NEW. , idem para o old.

Termine com : os comandos

 

CREATE OR REPLACE TRIGGER TRG_FICHA_PROPRIETARIO
BEFORE INSERT OR DELETE OR UPDATE
ON OFI_FICHA_PROPRIETARIO
FOR EACH ROW
BEGIN
IF INSERTING OR UPDATING THEN
 INSERT INTO AUX_FICHA_PROPRIETARIO (CHASSI,CLIENTE,DTA_ALTERACAO,PROPRIETARIO_ATUAL,DTA_AQUISICAO)
 VALUES (:NEW.CHASSI,:NEW.CLIENTE,SYSDATE,:NEW.PROPRIETARIO_ATUAL,:NEW.DTA_AQUISICAO);
ELSIF DELETING THEN
 INSERT INTO AUX_FICHA_PROPRIETARIO (CHASSI,CLIENTE,DTA_ALTERACAO,PROPRIETARIO_ATUAL,DTA_AQUISICAO)
 VALUES (:OLD.CHASSI,:OLD.CLIENTE,SYSDATE,'N',:OLD.DTA_AQUISICAO);
END IF;
END;

 

Sem entra no mérito da lógica.

 

A operação deve estar em transaction pois um erro na operação pode ocorrer e aí o registro já foi inserido.

 

Eu faria a trigger como AFTER, pois assim a operação já foi feita(manter o transaction).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Motta,

 

Sensacional!

 

Funcionou certinho...

Porém eu sou mto leigo nesse assunto.. fiquei procurando no google sobre isso...

 

Voce pode me explicar aquelelance que disse ali...

 

"A operação deve estar em transaction pois um erro na operação pode ocorrer e aí o registro já foi inserido."

 

Eu pensei que seria EACH ROW, mas você tem razao.. meu SQL nao deleta vários proprietarios de uma vez só.. deleta um por um... bem pensando...

 

Eu faria a trigger como AFTER, pois assim a operação já foi feita(manter o transaction).

 

Tem razao.. eu pensei que BEFORE, fosse depois... realmente.. vou inverter!

 

OBRIGADO!!!!!

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.