[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