2012-05-05 8 views
5

Ich versuche, einen PostgreSQL-Trigger in einem Play2.0 Datenbank-Entwicklungsskript zu erstellen. Der SQL-Code ist relativ einfach und läuft gut in pgAdminIII:PostgreSQL-Trigger mit JDBC erstellen

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

Allerdings habe ich eine Fehlermeldung erhalten, wenn die Entwicklung ausgeführt wird: ERROR: unterminated dollar-quoted string at or near "$$ BEGIN NEW.modified = now()". Der SQL-Code scheint bei das erste Semikolon in der Funktion abgeschnitten zu werden. Ich verwende den JDBC-Treiber "9.1-901.jdbc4" für PostgreSQL.

Update:

Der Code in Evolutions.scala (Linie 219+) führt eine einfache Spaltung auf dem ;. Scheint im Rahmen selbst fehlerhaft zu sein:

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

Irgendwelche Lösungen?

+0

Das Problem wurde auch hier [http://archives.postgresql.org/pgsql-jdbc/2010-03/msg00056.php] diskutiert. – fynn

+0

Bitte zeigen Sie uns den Java-Code, der den Trigger erzeugt. –

+0

Der Code, der den Trigger erstellt, ist nicht mein eigener Code, da das SQL-Skript ein [Play Datenbank-Entwicklungsskript] (http://www.playframework.org/documentation/2.0/Evolutions) ist. Ich denke, der (Scala!) Code kann [hier] gefunden werden (https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/db/evolutions /Evolutions.scala). – fynn

Antwort

2

Sie können Folgendes versuchen.

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(); 
    } 

Hoffe, das wird für Sie arbeiten.

+0

Und wo wäre der richtige Ort für den Code? Es muss ausgeführt werden, bevor die Entwicklungen ausgewertet werden. Die 'Gloabal'' onStart' Methode scheint der falsche Ort zu sein ... – fynn