2012-05-05 35 views
5

Play2.0データベース進化スクリプトでPostgreSQLトリガーを作成しようとしています。 SQLコードは、比較的簡単で、pgAdminIIIで正常に動作:JDBCを使用してPostgreSQLトリガーを作成する

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

しかし、進化を実行しているとき、私はエラーを取得:ERROR: unterminated dollar-quoted string at or near "$$ BEGIN NEW.modified = now()"。 SQLコードは、関数内で最初に見つかったセミコロン に切り捨てられているようです。私はPostgreSQL用に "9.1-901.jdbc4" JDBCドライバを使用しています。

更新:Evolutions.scala

コード(行は219+);に単純な分割を行います。フレームワーク自体に欠陥があるようです:

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

すべての解決策はありますか?

+0

問題については、[こちら](http://archives.postgresql.org/pgsql-jdbc/2010-03/msg00056.php)でも説明されています。 – fynn

+0

トリガーを作成するJavaコードを表示してください。 –

+0

トリガーを作成するコードは、SQLスクリプトが[データベースの進化のスクリプト](http://www.playframework.org/documentation/2.0/Evolutions)であるため、私のものではありません。私は(Scala!)コードが見つかりました[ここ](https://github.com/playframework/Play20/blob/master/framework/src/play/src/main/scala/play/api/db/evolutions) /Evolutions.scala)。 – fynn

答えて

2

次のことを試すことができます。

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

これはうまくいきます。

+0

そして、コードの正しい場所はどこですか?進化が評価される前に実行される必要があります。 'Gloabal'の' onStart'メソッドが間違っているようです... – fynn

関連する問題