Как создать триггеры для db postgreSQL с использованием Liquibase?
Я использую модуль dropwizrd-migrations для рефакторинга Liquibase db. См. Руководство здесь: http://dropwizard.codahale.com/manual/migrations/
Когда я запускаю java -jar my_project.jar db migrate my_project.yml
Я получаю следующую ошибку:
ERROR [2013-09-11 20: 53: 43,089] Liquibase: Изменить Установить migrations.xml :: 11 :: me failed. Ошибка: Ошибка выполнения SQL CREATE ИЛИ REPLACE TRIGGER add_current_date_to_my_table ПЕРЕД ОБНОВЛЕНИЕМ НА my_table ДЛЯ КАЖДОЙ ПРОГРАММЫ ВЫПОЛНЕНИЯ ROW change_update_time() ;: ERROR: синтаксическая ошибка на или рядом с "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 от создания функции?
Ответы
Ответ 1
Решение:
<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.