我如何使用liquibase为PostgreSQL数据库创建触发器?

问题描述 投票:14回答:1

我正在使用dropwizard-migrations模块进行liquibase数据库重构。请参见此处的指南:http://dropwizard.codahale.com/manual/migrations/

当我跑步时java -jar my_project.jar db migration my_project.yml

我收到以下错误:

错误[2013-09-11 20:53:43,089] liquibase:更改集migrations.xml :: 11 :: me失败。错误:执行SQL创建或替换触发器add_current_date_to_my_table之前,在my_table上为每个行执行过程更新之前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触发器”是否多余?

postgresql liquibase dropwizard
1个回答
18
投票

解决方案是:

<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 Jens。

© www.soinside.com 2019 - 2024. All rights reserved.