Meus caros,

Tenho 3 triggers que já utilizo a um bom tempo. Elas são responsaveis para
alimentar 3 tabelas que tem informações resumidas que apareceram na home do
site (www.saopaulofc.com.br)

De uns dias para ká, ao gravar a noticia no site, as 3 triggers tem demorado
para atualizar, não entendi pq desta mudança de comportamento.

Vou mostrar abaixo o codigo das triggers. Uma breve explicação, estas
triggers foram criadas para que na Home onde tem um grande trafico, não
precisasse ficar fazendo consultas SQL na massa de dados (tabela noticias),
então na postagem da noticia, ele alimenta 3 tabelas que tem apenas o que
realmente precisa aparecer na home do site.

--- Tabela Noticia -> chamada das TRIGGERS ----------------------
CREATE TRIGGER tg_a_iud_noticia_seq01
  AFTER INSERT OR UPDATE OR DELETE
  ON noticia
  FOR EACH ROW
  EXECUTE PROCEDURE fc_noticia_home();
COMMENT ON TRIGGER tg_a_iud_noticia_seq01 ON noticia IS 'Atualiza tabela que
mostrará listagens da noticia no site.';

CREATE TRIGGER tg_a_iud_noticia_seq02
  AFTER INSERT OR UPDATE OR DELETE
  ON noticia
  FOR EACH ROW
  EXECUTE PROCEDURE fc_botequim();
COMMENT ON TRIGGER tg_a_iud_noticia_seq02 ON noticia IS 'Atualiza tabela que
mostrará o botequim.';

CREATE TRIGGER tg_a_iud_noticia_seq03
  AFTER INSERT OR UPDATE OR DELETE
  ON noticia
  FOR EACH ROW
  EXECUTE PROCEDURE fc_destaque();
COMMENT ON TRIGGER tg_a_iud_noticia_seq03 ON noticia IS 'Atualiza tabela que
mostrará as noticias em destaque.';

----- CRIAÇÃO DA TRIGGER ------------
CREATE OR REPLACE FUNCTION fc_botequim()
  RETURNS trigger AS
$BODY$begin

DROP INDEX idx_mv_botequim_seq01;
PERFORM refresh_matview('mv_botequim');
CREATE INDEX idx_mv_botequim_seq01 ON mv_botequim(not_data);

RETURN NULL;

end$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fc_botequim() OWNER TO dbspneta1;
COMMENT ON FUNCTION fc_botequim() IS 'Seleciona o botequim do destaque';

----- CRIAÇÃO DA TRIGGER ------------
CREATE OR REPLACE FUNCTION fc_noticia_home()
  RETURNS trigger AS
$BODY$begin

DROP INDEX idx_mv_noticia_home_seq01;
PERFORM refresh_matview('mv_noticia_home');
CREATE INDEX idx_mv_noticia_home_seq01 ON mv_noticia_home(not_data);

RETURN NULL;

end$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fc_noticia_home() OWNER TO dbspneta1;
COMMENT ON FUNCTION fc_noticia_home() IS 'Seleciona as noticias da home';

----- CRIAÇÃO DA TRIGGER ------------
CREATE OR REPLACE FUNCTION fc_destaque()
  RETURNS trigger AS
$BODY$begin

DROP INDEX idx_mv_destaque_seq01;
PERFORM refresh_matview('mv_destaque');
CREATE INDEX idx_mv_destaque_seq01 ON mv_destaque(not_data);

RETURN NULL;

end$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION fc_destaque() OWNER TO dbspneta1;
COMMENT ON FUNCTION fc_destaque() IS 'Seleciona as noticias do destaque';

A função refresh_matview, foi criada para atualizar a minha "materialize
view", é uma função que já uso em outros pontos do banco de dados, e sempre
funcionou perfeito.
CREATE OR REPLACE FUNCTION refresh_matview(name)
  RETURNS void AS
$BODY$
 DECLARE
     matview_name ALIAS FOR $1;
     entry matview%ROWTYPE;
 BEGIN

     SELECT * INTO entry FROM matview WHERE mtv_name = matview_name;

     IF NOT FOUND THEN
         RAISE EXCEPTION 'Materialized view % does not exist.',
matview_name;
    END IF;

    EXECUTE 'DELETE FROM ' || matview_name;
    EXECUTE 'INSERT INTO ' || matview_name
        || ' SELECT * FROM ' || entry.mtv_view;

    UPDATE matview
        SET mtv_lastrefr=CURRENT_TIMESTAMP
        WHERE mtv_name=matview_name;

    RETURN;
END
$BODY$
  LANGUAGE plpgsql VOLATILE SECURITY DEFINER
  COST 100;
ALTER FUNCTION refresh_matview(name) OWNER TO dbspneta1;
COMMENT ON FUNCTION refresh_matview(name) IS 'Atualização da materialized
view';

Se alguém puder me ajudar eu agradeço.

-- 
[]s
Nilson Chagas - Ubuntu User 25794
---
Visite:
http://www.avozdoevangelho.com.br -> Peça gratuitamente um curso Bíblico

Twitter: avozdoevangelho    Twitter: matrixspnet

http://www.amados.com.br
http://bbnradio.org -> Ouça a rádio e faça gratuitamente um Curso Biblico
On-Line
_______________________________________________
pgbr-geral mailing list
pgbr-geral@listas.postgresql.org.br
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a