[Portugal] Postgresql
Filipe Brandão
fgbrandao emepc-portugal.org
Terça-Feira, 10 de Julho de 2012 - 02:43:51 PDT
Duarte,
Não, não funciona.
Experimentei criar o trigger para a 2ª tabela, para o after insert (é a
unica operação que existe nesta 2ª tabela) enviar o email para o ultimo
endereço de email inserido e manda para o penúltimo.
O que se passa é que uma vez que o ultimo insert só acontece de facto
(commit) depois de estes triggers terem acabado, ele vai buscar o registo
que para ele é o último.
Daí pretender utilizar o script do primeiro trigger, onde consigo ir buscar
o novo valor de email, mesmo que ainda não tenha sido feito o commit na BD.
Esse primeiro trigger tem o seguinte código:
CREATE OR REPLACE FUNCTION sde.A() RETURNS TRIGGER AS $A$
BEGIN
IF (TG_OP = 'UPDATE') THEN
-- insiro na tabela teste_1_audit os valores novos da tabela
teste_1
INSERT INTO sde.teste_1_audit SELECT 'u', now(), user, *
NEW.email*;
RETURN NEW;
END IF;
END;
$A$ LANGUAGE plpgsql;
CREATE TRIGGER A
AFTER UPDATE ON sde.teste_1
FOR EACH ROW EXECUTE PROCEDURE sde.A();
Repara que o NEW.email é o novo email e este é passado para a 2ª tabela
correctamente.
Se eu conseguisse pôr esta mesma função no script de envio de email (em
python) penso que teria o problema resolvido. Para isso experimentei o
seguinte código:
CREATE OR REPLACE FUNCTION sde.py() RETURNS TRIGGER AS $py_$
import smtplib
import psycopg2
SMTP_SERVER = 'smtp.gmail.com'
SMTP_PORT = 587
sender = 'xxxx xxxx.com'
password = 'yyyyyy'
conn_string = "host='localhost' dbname='sde' user='postgres'
password='xxxxxx'"
connection = psycopg2.connect(conn_string)
cursor = connection.cursor()
SQL = """
CREATE OR REPLACE FUNCTION sde.C() RETURNS TRIGGER AS $PY_$
BEGIN
IF (TG_OP = 'UPDATE') THEN
SELECT NEW.francisco FROM SDE.TESTE_1;
RETURN NEW;
END IF;
END;
$PY_$ LANGUAGE plpgsql;
"""
cursor.execute(SQL)
recipient = cursor.fetchone()[0]
subject = 'Candidatura'
body = 'bla bla bla'
"Sends an e-mail to the specified recipient."
body = "" + body + ""
headers = ["From: " + sender,
"Subject: " + subject,
"To: " + recipient,
"MIME-Version: 1.0",
"Content-Type: text/html"]
headers = "\r\n".join(headers)
session = smtplib.SMTP("smtp.gmail.com", 587)
session.ehlo()
session.starttls()
session.ehlo
session.login(sender, password)
session.sendmail(sender, recipient, headers + "\r\n\r\n" + body)
session.quit()
$py_$ LANGUAGE plpythonu;
CREATE TRIGGER py_
AFTER UPDATE ON SDE.TESTE_1
FOR EACH ROW EXECUTE PROCEDURE sde.py();
Aqui o problema é que a variável fica sem valor.
Dá o erro:
DETAIL: <class 'psycopg2.ProgrammingError'>: no results to fetch
Se este script funcionar, penso que fico com o problema resolvido...
Espero ter-me feito entender...
Obrigado mais uma vez!
Filipe
2012/7/10 duartecarreira <dncarreira gmail.com>
> Filipe, não percebo uma coisa.
>
> Se criares um trigger na 2ª tabela, isso não funciona? Ou seja, um novo
> after update mas na 2ª tabela? Pelo que vejo, a 2ª tabela também tem o
> email...
>
> Duarte
>
> --
> View this message in context:
> http://osgeo-org.1560.n6.nabble.com/Postgresql-tp4987061p4987174.html
> Sent from the OSGeo Portuguese Local Chapter mailing list archive at
> Nabble.com.
> _______________________________________________
> Portugal mailing list
> Portugal lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/portugal
>
--
*Filipe Brandão
*
Gabinete de Geomática
E-mail: fgbrandao emepc-portugal.org <fgbrandao am-em.org>
Ext. interna: 204176
Estrutura de Missão para a Extensão da Plataforma Continental / Task Group
for the Extension of the Portuguese Continental Shelf
http://www.emam.com.pt/
Rua Costa Pinto 165,
2770-047 Paço de Arcos, Portugal
Telefone: 213 804 250, 213 004 165 Fax: 213 905 225
-------------- próxima parte ----------
Um anexo em HTML foi limpo...
URL: <http://lists.osgeo.org/pipermail/portugal/attachments/20120710/919935ac/attachment-0001.html>
More information about the Portugal
mailing list