15

私は、liquibase db リファクタリングに dropwizard-migrations モジュールを使用しています。こちらのガイドを参照してください: http://dropwizard.codahale.com/manual/migrations/

java -jar my_project.jar db migrate my_project.yml を実行すると

次のエラーが表示されます。

エラー [2013-09-11 20:53:43,089] liquibase: 変更セット migrations.xml::11::me に失敗しました。エラー: SQL CREATE OR REPLACE TRIGGER add_current_date_to_my_table BEFORE UPDATE ON my_table FOR EACH ROW EXECUTE PROCEDURE change_update_time(); の実行中にエラーが発生しました;: エラー: "TRIGGER" 位置またはその近くで構文エラーが発生しました: 19

私の migrations.xml ファイルからの関連するいくつかの変更セットを次に示します。

<changeSet id="1" author="me">
    <createProcedure>
        CREATE OR REPLACE FUNCTION change_update_time() RETURNS trigger
        LANGUAGE plpgsql
        AS $$
        BEGIN
        NEW.updated_at := CURRENT_TIMESTAMP;
        RETURN NEW;
        END;
        $$;
    </createProcedure>
    <rollback>
        DROP FUNCTION change_update_time();
    </rollback>
</changeSet>        

<changeSet id="2" author="me">
    <preConditions>
        <not>
            <tableExists tableName="my_table"/>
        </not>
    </preConditions>

    <createTable tableName="my_table">
        <column name="_id" type="integer" defaultValue="0">
            <constraints nullable="false"/>
        </column>
        <column name="updated_at" type="timestamp without time zone" defaultValue="now()">
            <constraints nullable="false"/>
        </column>
    </createTable>
</changeSet>

<changeSet id="3" author="me">
    <sql splitStatements="false">
        CREATE OR REPLACE TRIGGER add_current_date_to_my_table BEFORE UPDATE ON my_table FOR EACH ROW EXECUTE PROCEDURE change_update_time();
    </sql>
    <rollback>
        DROP TRIGGER add_current_date_to_my_table ON my_table;
    </rollback>
</changeSet>

トリガー add_current_date_to_my_table を作成する方法はありますか? これは、関数の作成による「RETURNS トリガー」と重複していますか?

4

2 に答える 2

20

解決策は次のとおりです。

<changeSet id="3" author="me">
    <sql>
        DROP TRIGGER IF EXISTS add_current_date_to_my_table ON my_table;
        CREATE TRIGGER add_current_date_to_my_table BEFORE UPDATE ON my_table FOR EACH ROW EXECUTE PROCEDURE change_update_time();
    </sql>
    <rollback>
        DROP TRIGGER add_current_date_to_my_table ON my_table;
    </rollback>
</changeSet>

H/T ジェンス。

于 2013-09-13T22:40:57.957 に答える