Claudio, bom
dia!
Obrigado pela resposta, porem
note que sao dois momentos diferentes, o "after delete" mencionado na
trigger(3) significa somente que a trigger sera disparada apos a exclusao
de dados na tabela tbl_dataliner_total (vide funcao 2),
e o tg_op="INSERT" e apenas um if clause da funcao 4 que serve para
criar e inserir o novo agrupamento da tabela
tbl_dataliner, na tabela
tbl_dataliner_total.
Note que as funcoes/triggers
devem funcionar quase que simultaneamente, ou seja, sempre que inserir um novo grupo de dados
na tabela tbl_dataliner, os seguintes passos deverao
acontecer:
1) Todos os dados existentes na tabela
tbl_dataliner_total deverao ser deletados, e em
seguida;
2) Um novo agrupamento da
tabela tbl_dataliner devera ser
criado;
3) Esse agrupamento devera ser
inserido na tabela
tbl_dataliner_total
Se vc conhecer uma outra forma de fazer acontecer esses passos, gostaria
muito de saber.
Sds
Paulo
-----Mensagem original-----
De: Claudio Oliveira [mailto:[EMAIL PROTECTED]
Enviada em: segunda-feira, 30 de janeiro de 2006 18:32
Para: [EMAIL PROTECTED]
Assunto: RE: !RES: [PostgreSQL-Brasil] STORED PROCEDURES - TRIGGERSOlá,
Verifique que na trigger (3) ins_dataliner_total vc menciona um after delete e na funcao vc faz referencia a um tg_op="INSERT" ?????
Claudio Oliveira
http://www.msisolucoes.com.br
-----Mensagem original-----
De: Paulo Rogerio Zimolo [mailto:[EMAIL PROTECTED]
Enviada em: segunda-feira, 30 de janeiro de 2006 15:30
Para: [email protected]
Assunto: STORED PROCEDURES - TRIGGERSAlguem da lista sabe como resolver esse problema?Sds
Paulo-----Mensagem original-----
De: Paulo Rogerio Zimolo [mailto:[EMAIL PROTECTED]
Enviada em: sexta-feira, 27 de janeiro de 2006 16:36
Para: [email protected]
Assunto: STORED PROCEDURES - TRIGGERSSenhores,Tenho duas tabelas, tbl_dataliner e tbl_dataliner_total, sendo que a segunda consiste em um agrupamento de alguns dados da primeira.Como semanalmente tenho que inserir dados na tbl_dataliner (aprox 30000 registros), criei as triggers abaixo para que depois de inserir os dados na tbl_dataliner, os dados da tbl_dataliner_total sejam deletados, para que em seguida seja refeito o agrupamento dos dados da tabela tbl_dataliner para a tabela tbl_dataliner _total (ja incluindo os novos dados).Ocorre que as funcoes nao estao funcionando corretamente.Nao sei se estou fazendo do jeito certo, portanto se alguem conhecer alguma forma de fazer com que a funcao seja chamada apenas uma vez (pelo select) e nao por cada entrada, ou mesmo se puder dizer onde estou errando, eu agradeceria muito.AtenciosamentePaulo1) create trigger exc_dataliner_total after insert on tbl_dataliner for each statement execute procedure fexc_dataliner_total();2) CREATE OR REPLACE FUNCTION fexc_dataliner_total() returns trigger as
'
BEGINDELETE from tbl_dataliner_total;
RETURN OLD;
END;
'
LANGUAGE 'PLPGSQL';
3)create trigger ins_dataliner_total after delete on tbl_dataliner_total for each statement execute procedure fins_dataliner_total();4)CREATE OR REPLACE FUNCTION fins_dataliner_total() returns trigger as
'
DECLARE
reg RECORD;BEGIN
if tg_op = ''INSERT'' then
FOR reg IN SELECT fk_lporto, fk_cliente, fk_carrier, commodity, fk_odporto, fk_direction, fk_month, year, SUM(teu)::INT AS teu FROM tbl_dataliner GROUP BY fk_lporto, fk_cliente, fk_carrier, commodity, fk_odporto, fk_direction, fk_month, year
LOOP
INSERT INTO tbl_dataliner_total (fk_lporto, fk_cliente, fk_carrier, commodity, fk_odporto, fk_direction, fk_month, year, teu)
VALUES (reg.fk_lporto, reg.fk_cliente, reg.fk_carrier, reg.commodity, reg.fk_odporto, reg.fk_direction, reg.fk_month, reg.year, reg.teu);
END LOOP;
END if;
return reg;
END;
'
LANGUAGE 'PLPGSQL';
_______________________________________________ Grupo de Usuários do PostgreSQL no Brasil http://www.postgresql.org.br
