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

如何使用liquibase为postgreSQL数据库创建触发器?,postgresql,liquibase,dropwizard,Postgresql,Liquibase,Dropwizard,我正在使用dropwizard迁移模块进行liquibase db重构。请参见此处的指南: 当我跑的时候 java-jar my_project.jar db migrate my_project.yml 我得到以下错误: 错误[2013-09-11 20:53:43089]liquibase:更改集迁移。xml::11::me失败。错误:执行SQL CREATE或REPLACE触发器时出错在更新my_表之前,为每行执行SQL CREATE或REPLACE触发器将_current_date_添加

我正在使用dropwizard迁移模块进行liquibase db重构。请参见此处的指南:

当我跑的时候 java-jar my_project.jar db migrate my_project.yml

我得到以下错误:

错误[2013-09-11 20:53:43089]liquibase:更改集迁移。xml::11::me失败。错误:执行SQL CREATE或REPLACE触发器时出错在更新my_表之前,为每行执行SQL CREATE或REPLACE触发器将_current_date_添加到_my_表执行过程更改_UPDATE_time();:错误:“触发器”处或附近出现语法错误 职位:19

以下是my 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>

创建或替换函数change\u update\u time()返回触发器
语言plpgsql
作为$$
开始
NEW.updated_at:=当前_时间戳;
归还新的;
结束;
$$;
删除函数更改\更新\时间();
创建或替换触发器在更新每一行的my_表之前,将_current_date_添加到_my_表执行过程更改_UPDATE_time();
下拉触发器将\u当前\u日期\u添加到我的\u表上的\u我的\u表;
是否有任何方法可以创建触发器添加到我的表中?这是否与创建函数时的“返回触发器”冗余?

解决方案是:

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

下拉触发器(如果存在)将\u当前\u日期\u添加到我的\u表上的\u我的\u表;
为每行在my_表上更新之前创建触发器将_current_date_添加到_my_表执行过程更改_UPDATE_time();
下拉触发器将\u当前\u日期\u添加到我的\u表上的\u我的\u表;

H/T Jens.

我对Postgres一点也不了解,但存储过程是否独立工作?您收到的错误消息来自postgres。“创建或替换触发器”有效吗?快速谷歌搜索显示触发器可能会被删除,就像
删除触发器(如果存在…
)。无论如何首先尝试手动创建触发器,并确保其正常工作。Liquibase将只执行相同的SQL。