如何使用liquibase为postgreSQL数据库创建触发器?
我正在使用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文件中的一些相关变更集:如何使用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_添加
<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。