2012-05-05 18 views
5

Estoy intentando crear un desencadenador PostgreSQL en una secuencia de comandos de evolución de base de datos Play2.0. El código SQL es relativamente fácil y funciona muy bien en pgAdminIII:Crear desencadenador PostgreSQL mediante JDBC

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

Sin embargo, me da un error cuando se ejecuta la evolución: ERROR: unterminated dollar-quoted string at or near "$$ BEGIN NEW.modified = now()". El código SQL parece truncado en el primer punto y coma encontrado en la función. Estoy usando el controlador JDBC "9.1-901.jdbc4" para PostgreSQL.

Actualización:

El código en Evolutions.scala (línea 219+) realiza una fractura simple en la ;. Parece estar defectuoso en el marco mismo:

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

¿Alguna solución?

+0

El problema ha sido discutido [aquí] (http://archives.postgresql.org/pgsql-jdbc/2010-03/msg00056.php) también. – fynn

+0

Por favor, muéstrenos el código Java que crea el activador. –

+0

El código que crea el desencadenador no es mío, ya que el guión sql es un [guión de evolución de la base de datos de Play] (http://www.playframework.org/documentation/2.0/Evolutions). Supongo que el código (de Scala!) Se puede encontrar [aquí] (https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/db/evolutions /Evolutions.scala). – fynn

Respuesta

2

Puede intentar lo siguiente.

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

Espero que esto funcione para usted.

+0

¿Y dónde sería el lugar correcto para el código? Necesita ser ejecutado antes de que las evoluciones sean evaluadas. El método 'onStart' de' Gloabal' parece ser el lugar equivocado ... – fynn

Cuestiones relacionadas