Trigger

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
cdavid30
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 14 Set 2012 9:11 am

Olá, preciso criar uma trigger em para deletar faturas indevidas.

fiz da seguinte forma:

Selecionar tudo

BEGIN

IF INSERTING PLACA
WHEN (DATA_LOG FROM TB_LOG_PLACA > PG_DT_FAT) (se for inserido uma nova fatura pela placa do carro e a data de log for maior que a data de vencimento da fatura, delete, lembrando que a placa e Data_Log estão em outra tabela)

THEN DELETE (está dando erro)

ELSIF INSERTING PLACA
WHEN (STATUS_PLACA=0) (senao, se a placa for STATUS_PLACA=0, delete, SENDO STATUS_PLACA está em outra tabela)

THEN DELETE


END IF;
END
como eu faço para dizer para a Trigger que os campos Placa e Data_Log e STATUS_PLACA estão na tabela x?

cdavid30
Curioso

Mensagens: 1
Registrado em: Sex Set 14, 2012 9:51 am
marlonsc
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 28 Ago 2012 4:33 pm
Localização: São Paulo
Contato:

cdavid30

Você teria como postar mais informações sobre o seu problema.

Pelo que entendi você está tentando apagar o registro na hora de uma manipulação de dados, se for isso vai dar erro.

Você poderia que fazer uma checagem no insert e gerar um erro para impedir a inserção ou alteração do dado.

Saudações,

Marlon Costa
http://www.marlonscdba.com
cdavid30
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 14 Set 2012 9:11 am

Marlon, o que ocorre 'e o seguinte:

criei uma tabela chamada TB_LOG_PLACA(campos, ID, Placa, Data, Status CPF), nela estou gravando a data de insercao e update das placas de veiculos cadastrados. Tenho uma tabela chamada TB_CELULAR_PLACA(varios campos e em comum com a tabela TB_LOG_PLACA o campo placa e CPF) que gera faturas para essas placas, porem como ate então não havia uma data incial de insercao de placa ou inativacao de placas, o banco de dados estava gerando faturas anteriores a data de insercao da placa e posteriores a inativacao da placa, por esse motivo foi criada essa tabela de log TB_LOG_PLACA. Na tabela TB_CELULAR_PLACA eu preciso criar uma trigger que faca o seguinte:

primeira situacao: se aparecer uma placa nova e a fatura gerada for com data menor que a data da mesma placa na tabela log, então delete-a,
segunda situacao: se aparecer uma fatura com data maior que a inativacao da placa (campo Status), delete-a
marlonsc
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 28 Ago 2012 4:33 pm
Localização: São Paulo
Contato:

cdavid30, boa noite,

Pelo que entendi você precisa validar se o dado é valido antes de inseri-lo. Você pode escrever uma trigger como no exemplo abaixo:

Selecionar tudo

create or replace trigger "TI_TB_CELULAR_PLACA_DATA"
before
insert on "TB_CELULAR_PLACA" for each row
declare
     V_DATA_INSERCAO date;
     V_DATA_INATIVACAO date;
begin 

 select nvl(P.DATA_INSERCAO, to_date('01/01/0001','DD/MM/YYYY'), 
        nvl(P.DATA_INATIVACAO, to_date('01/01/9999','DD/MM/YYYY')
   into V_DATA_INSERCAO, V_DATA_INATIVACAO
   from TB_LOG_PLACA P
  where P.CPF = :new.CPF
    and P.PLACA = :new.PLACA;

 if (:new.DATA_LOG < v_data_insercao or :new.DATA_LOG > v_data_inativaco )
 then 
         raise_application_error(-20634, 'Data invalida.');
 end if;

end;
O problema ai é que você vai precisar tratar no sistema o erro gerado por esta trigger pois ele não vai apagar o dado silenciosamente.

Sds,

Marlon Costa
http://www.marlonscdba.com
cdavid30
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 14 Set 2012 9:11 am

Marlon, na realidade eu preciso deletar um registro após ele ser inserido, pois dentro da aplicação o insert está sendo efetuado de forma incorreta e eu não tenho acesso á aplicação, portanto preciso deletar o registro indevido.
marlonsc
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 10
Registrado em: Ter, 28 Ago 2012 4:33 pm
Localização: São Paulo
Contato:

cdavid30, boa noite,

Neste caso uma Trigger não vai lhe ajudar pois ao impedir a gravação vai retornar um erro para a aplicação.

É melhor você criar uma Procedure de validação dos dados que apague os dados incorretos e agendá-la como um Job ou Scheduler de banco.

Sds,

http://www.marlonscdba.com
cdavid30
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 14 Set 2012 9:11 am

Marlon,

Na realidade eu não vou impedir a inserção, eu quero que ao inserir um dado, ele seja exlcluido dentro da minha condição.

Fiz a trigger da seguinte maneira, após insert:

Selecionar tudo

BEGIN

DELETE FROM TB_PAGAMENTO P
JOIN TB_LOG_PLACA L ON P.PLACA = L.PLACA
WHERE L.STATUS_PLACA = 1
AND L.DATA = (SELECT MAX(L2.DATA)
                FROM TB_LOG_PLACA L2
                WHERE L2.STATUS_PLACA = 0 AND L2.PLACA = L.PLACA) > P.PG_DT_FAT



DELETE FROM TB_PAGAMENTO P
JOIN TB_LOG_PLACA L ON P.PLACA = L.PLACA
WHERE L.STATUS_PLACA = 0
  AND L.DATA = (SELECT MAX(L2.DATA)
                FROM TB_LOG_PLACA L2
                WHERE L2.STATUS_PLACA = 0 AND L2.PLACA = L.PLACA) < P.PG_DT_FAT

END;
Eu preciso inserir a informação :old ou :new? Em qual lugar?
cdavid30
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 14 Set 2012 9:11 am

Completando, está dando o seguinte erro:

(3): insert open rollback savepoint set sql execute commit forall
(3): merge pipe
cdavid30
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Sex, 14 Set 2012 9:11 am

Marlon, farei da forma como você me orientou, com procedure.

Obrigada.
qualquer coisa retorno o contato.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Majestic-12 [Bot] e 13 visitantes