[Portugal] Postgresql
Filipe Brandão
fgbrandao emepc-portugal.org
Segunda-Feira, 9 de Julho de 2012 - 14:55:38 PDT
Boa noite.
Gostaria de saber se alguém me pode ajudar num problema que estou a tentar
resolver.
Cenário: Tenho uma BD com duas tabelas. A primeira só tem uma linha, que se
pode editar (update) via user form. Cada vez que essa mesma linha é
editada, é populada a 2ª tabela (com um trigger que dispara sempre que há
um update na 1ª tabela), de modo incremental (insert). Deste modo tenho um
historial de todas as interacções entre utilizadores e a 1ª tabela.
Criei outro trigger para enviar emails aos users que interajam com a 1ª
tabela (um dos campos que preenchem é um endereço de email), também depois
de haver updates nessa mesma 1ª tabela. Este trigger dispara um script em
python que faz esse mesmo envio.
Preciso ainda que cada vez que haja um envio, este seja feito para o ultimo
endereço a ser inserido na 2ª tabela (tenho um atributo com datatype
serial, para saber sempre qual a ultima linha da tabela). Até aqui tudo ok.
Agora o problema. Quando há um update na 1ª tabela os dois triggers
disparam e correm, mas no caso do envio de emails é sempre enviado o email
para o *ultimo registo da tabela antes desse mesmo update*!
Ou seja, há uma transacção em curso e o trigger "não vê" o ultimo registo
uma vez que ainda não foi feito um commit na BD, que só acontece depois de
a transacção acabar.
Já vi que não é possível disparar triggers depois de triggers, que não
consigo fazer commit a meio de uma transacção, etc.
Como poderei dar a volta a isto?
Aquilo que me pareceu mais óbvio era aproveitar o primeiro trigger de que
vos falei, uma vez que nele consigo ir buscar os novos valores da 1ª tabela
(que depois são inseridos na 2ª). Mas não consegui programar o script em
python para incluir essa mesma função.
A função é basicamente isto, e funciona bem (ele saca o new.email para a 2ª
tabela):
CREATE OR REPLACE FUNCTION process_emp_audit() RETURNS TRIGGER AS $emp_audit$
BEGIN
IF (TG_OP = 'UPDATE') THEN
INSERT INTO emp_audit SELECT 'D', now(), user, *NEW.email*;
END IF;
RETURN NULL; -- result is ignored since this is an AFTER trigger
END;
$emp_audit$ LANGUAGE plpgsql;
CREATE TRIGGER emp_audit
AFTER UPDATE ON emp
FOR EACH ROW EXECUTE PROCEDURE process_emp_audit();
A função em python já a tenho escrita e funciona bem (neste momento não
tenho aqui o código).
Precisava apenas de conseguir definir uma variável no python que me desse o
valor do *NEW.email*, do género recipient = select NEW.email from emp;
Alguma ideia de como ir sacar aquele new.email e usar como variável no
script em python?
Obrigado a todos e espero ter-me feito entender...
Filipe
-------------- próxima parte ----------
Um anexo em HTML foi limpo...
URL: <http://lists.osgeo.org/pipermail/portugal/attachments/20120709/627b0268/attachment.html>
More information about the Portugal
mailing list