2012-05-05 9 views
5

Sto cercando di creare un trigger PostgreSQL in uno script di evoluzione del database Play2.0. Il codice SQL è relativamente facile e funziona bene in pgAdminIII:Creazione di trigger PostgreSQL utilizzando JDBC

CREATE OR REPLACE FUNCTION update_modified() RETURNS TRIGGER AS $$ 
    BEGIN 
    NEW.modified = now(); 
    RETURN NEW; 
    END; 
$$ LANGUAGE 'plpgsql'; 

Tuttavia, ottengo un errore durante l'esecuzione l'evoluzione: ERROR: unterminated dollar-quoted string at or near "$$ BEGIN NEW.modified = now()". Il codice SQL sembra essere troncato a il primo punto e virgola incontrato nella funzione. Sto usando il driver JDBC "9.1-901.jdbc4" per PostgreSQL.

Aggiornamento:

Il codice in Evolutions.scala (linea 219+) esegui una semplice spaccatura sul ;. Sembra essere difettoso nel quadro stesso:

// Execute script 
s.sql.split(";").map(_.trim).foreach { 
    case "" => 
    case statement => execute(statement) 
} 

Qualsiasi soluzione?

+0

Il problema è stato discusso [qui] (http://archives.postgresql.org/pgsql-jdbc/2010-03/msg00056.php). – fynn

+0

Mostraci il codice Java che crea il trigger. –

+0

Il codice che crea il trigger non è il mio poiché lo script sql è uno [script di sviluppo del database di riproduzione] (http://www.playframework.org/documentation/2.0/Evolutions). Immagino che il codice (Scala!) Possa essere trovato [qui] (https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/db/evolutions /Evolutions.scala). – fynn

risposta

2

Puoi provare la seguente cosa.

String sql = "CREATE OR REPLACE FUNCTION update_modified() RETURNS TRIGGER AS $$ " + 
      "BEGIN " + 
       "NEW.modified = now(); " + 
       "RETURN NEW; " + 
       "END; " + 
      "$$ LANGUAGE 'plpgsql';"; 
    DataSource ds = getDataSource(); 
    try { 
     Connection conn = ds.getConnection(); 
     conn.setAutoCommit(true); 
     Statement st = conn.createStatement(); 
     st.executeUpdate(sql); 
     st.close(); 
     conn.close(); 
    } catch (SQLException e) { 
     e.printStackTrace(); 
    } 

Spero che questo funzioni per voi.

+0

E dove sarebbe il posto giusto per il codice? Deve essere eseguito prima che le evoluzioni siano valutate. Il metodo 'onStart' di' Gloabal' sembra essere il posto sbagliato ... – fynn