Boa noite.<br><br>Gostaria de saber se alguém me pode ajudar num problema que estou a tentar resolver.<br>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.<br>
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.<br>
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.<br>
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 <b><u>ultimo registo da tabela antes desse mesmo update</u></b>!<br>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.<br>
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.<br>Como poderei dar a volta a isto?<br>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.<br>
A função é basicamente isto, e funciona bem (ele saca o new.email para a 2ª tabela):<br><pre class="PROGRAMLISTING">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, <font size="4"><b><u>NEW.email</u></b></font>;
END IF;<br><br> 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();</pre>A função em python já a tenho escrita e funciona bem (neste momento não tenho aqui o código).<br>Precisava apenas de conseguir definir uma variável no python que me desse o valor do <b><u>NEW.email</u></b>, do género recipient = select NEW.email from emp;<br>
Alguma ideia de como ir sacar aquele new.email e usar como variável no script em python?<br><br>Obrigado a todos e espero ter-me feito entender...<br><br>Filipe<br><br>