Trigger
Pessoal,
Estou com um problema, alguém pode me ajudar???
Tenho a tabela:
VIAGEM(COD, DT_INICIO, DT_FIM, HORARIO, ...)
e uma outra tabela chamada:
HISTORICO_VIAGEM(COD, DT_INICIO, DT_FIM, HORARIO, ...)
A tabela HISTORICO_VIAGEM deve guardar todas as movimentações (alterações e/ou exclusões) que forem feitas na tabela VIAGEM.
Ou seja quando o usuário tentar alterar o valor do campo DT_INICIO ou de qualquer outra o trigger deve ser disparado.
Tentei criar um trigger para ser disparado ao deletar ou alterar um dado na tabela viagem mas não está dando certo.
Como deve ser esse trigger? Ele deve copiar os campos da tabela viagem para o histórico? Como?
Como disparo ele na minha aplicação, pelo Delphi?
Estou com um problema, alguém pode me ajudar???
Tenho a tabela:
VIAGEM(COD, DT_INICIO, DT_FIM, HORARIO, ...)
e uma outra tabela chamada:
HISTORICO_VIAGEM(COD, DT_INICIO, DT_FIM, HORARIO, ...)
A tabela HISTORICO_VIAGEM deve guardar todas as movimentações (alterações e/ou exclusões) que forem feitas na tabela VIAGEM.
Ou seja quando o usuário tentar alterar o valor do campo DT_INICIO ou de qualquer outra o trigger deve ser disparado.
Tentei criar um trigger para ser disparado ao deletar ou alterar um dado na tabela viagem mas não está dando certo.
Como deve ser esse trigger? Ele deve copiar os campos da tabela viagem para o histórico? Como?
Como disparo ele na minha aplicação, pelo Delphi?
Barbara.michele
Curtidas 0
Respostas
Motta
06/10/2004
vc não falou o bd, as sintaxes e linguagem diferem.
vc deve criar uma trigger de after update delete
em oracle seria algo assim :
CREATE OR REPLACE TRIGGER trg_viagem
AFTER UPDATE OR DELETE
ON viagem
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
INSERT INTO VIAGEM_HISTORICO
COD, DT_INICIO, DT_FIM, HORARIO, ...)
VALUES
(:OLD.COD,:OLD.DT_INICIO,:OLD. DT_FIM, HORARIO, ...)
END;
MAS LEMBRO AS SINTAXES MUDAM MUITO
NO DELPHI VC NAO PRECISA FAZER NADA O BD DISPARA A TRIGGER
vc deve criar uma trigger de after update delete
em oracle seria algo assim :
CREATE OR REPLACE TRIGGER trg_viagem
AFTER UPDATE OR DELETE
ON viagem
REFERENCING NEW AS NEW OLD AS OLD
FOR EACH ROW
begin
INSERT INTO VIAGEM_HISTORICO
COD, DT_INICIO, DT_FIM, HORARIO, ...)
VALUES
(:OLD.COD,:OLD.DT_INICIO,:OLD. DT_FIM, HORARIO, ...)
END;
MAS LEMBRO AS SINTAXES MUDAM MUITO
NO DELPHI VC NAO PRECISA FAZER NADA O BD DISPARA A TRIGGER
GOSTEI 0
Barbara.michele
06/10/2004
Obrigada. Só me explique mais uma coisinha:
1- Veja se entendi bem. Você colocou o trigger para disparar depois de deletar ou alterar. Mesmo depois da ação o banco guarda os valores da linha que foi excluída e grava na tabela histórico?
2- O que faz a linha: REFERENCING NEW AS NEW OLD AS OLD ?
3- Se quiser exibir os dados da tabela HISTORICO em um DBGrid como faço para mostrar quais as linhas que foram excluídas? Como destacar no grid que tal linha foi excluída?
1- Veja se entendi bem. Você colocou o trigger para disparar depois de deletar ou alterar. Mesmo depois da ação o banco guarda os valores da linha que foi excluída e grava na tabela histórico?
2- O que faz a linha: REFERENCING NEW AS NEW OLD AS OLD ?
3- Se quiser exibir os dados da tabela HISTORICO em um DBGrid como faço para mostrar quais as linhas que foram excluídas? Como destacar no grid que tal linha foi excluída?
GOSTEI 0
Motta
06/10/2004
Obrigada. Só me explique mais uma coisinha:
1- Veja se entendi bem. Você colocou o trigger para disparar depois de deletar ou alterar. Mesmo depois da ação o banco guarda os valores da linha que foi excluída e grava na tabela histórico?
2- O que faz a linha: REFERENCING NEW AS NEW OLD AS OLD ?
3- Se quiser exibir os dados da tabela HISTORICO em um DBGrid como faço para mostrar quais as linhas que foram excluídas? Como destacar no grid que tal linha foi excluída?
2) exato ! responde a 1
3) se ela não existir na outra tabela é pq foi excluída
select * from viagem_historico
where not exists (seelct null form viagem where ....)
vc tb pode ´flagar´ a tabela de historico com o movimento executado
if Updating then
INSERT INTO VIAGEM_HISTORICO
(mov,COD, DT_INICIO, DT_FIM, HORARIO, ...)
VALUES
(´u´,:OLD.COD,:OLD.DT_INICIO,:OLD. DT_FIM, HORARIO, ...)
END;
elsif deleting
INSERT INTO VIAGEM_HISTORICO
(mov,COD, DT_INICIO, DT_FIM, HORARIO, ...)
VALUES
(´d´,:OLD.COD,:OLD.DT_INICIO,:OLD. DT_FIM, HORARIO, ...)
END;
end if;
GOSTEI 0