Liquibase с PostgreSQL: не создает функцию - PullRequest
0 голосов
/ 02 октября 2019

Liquibase на Postgresql вообще не создает функции / процедуры;Он корректно регистрирует в базе данных changelog текущий набор изменений как «выполненный», но функция не существует.

Я ищу, чтобы создать, а затем вызвать процедуру для поддержки обязательного внешнего ключа для нового поля со значением NULL;

Это мой включенный xml-файл с выделенным набором изменений:

<changeSet id="20190930_update_relation_001" author="bernardo">
    <sqlFile path="../script/20190930_update_script.sql" splitStatements="true"
             stripComments="true" dbms="PostgreSQL" encoding="utf8" relativeToChangelogFile="true" />
</changeSet>
<changeSet id="20190930_update_relation_002" author="bernardo">
        <sql dbms="PostgreSQL" splitStatements="true" stripComments="true">
            SELECT update_relation();
        </sql>
</changeSet>

, и это мой код plpgsql для:

CREATE OR REPLACE FUNCTION public.update_relation()
    RETURNS void
    LANGUAGE 'plpgsql>'
AS $BODY$
 declare
 prCrs [...]%rowtype;
 ngCrs [...]%rowtype;
 begin
    for prCrs in select [...] loop
    with row as (insert [...] RETURNING * )
    update [...] where  id = prCrs.id; --CURRENT OF prCrs;
    end loop;

    for ngCrs in select [...] loop
    with row as (insert [...] RETURNING * )
    update [...] where id = prCrs.id; --CURRENT OF ngCrs;
    end loop;
   end;$BODY$;

Это просто. Liquibase правильно регистрирует в таблице базы данных журнала изменений, но на самом деле функция не существует.

ПОЧЕМУ?

РЕДАКТИРОВАТЬ

даже тег -ext: createFunction- не работает;Я только что попробовал:

<changeSet id="20190930_update_indirizzo_relation_001" author="bernardo">
                <ext:createFunction dbms="PostgreSQL"
                                 encoding="utf8"
                                 relativeToChangelogFile="true"
                                 replaceIfExists="true"
                                 path="../script/20190930_update_indirizzo_script.sql"
                                 functionName="update_relation" />
                <!--<sqlFile path="../script/20190930_update_indirizzo_script.sql" splitStatements="false"-->
                         <!--stripComments="false" dbms="PostgreSQL" encoding="utf8" relativeToChangelogFile="true" />-->
            </changeSet>

Нет журнала ошибок, нет функции ... SOB! : - (

1 Ответ

0 голосов
/ 02 октября 2019

ПОСТАНОВИЛИ. с этой конфигурацией

    <preConditions>
        <dbms type="postgresql" />
    </preConditions>

[..............]

<changeSet id="..." author="ego">
   <sqlFile path="../script/20190930_update_indirizzo_relation_script.sql"
                         splitStatements="false"
                         stripComments="false"
                         encoding="utf8"
                         relativeToChangelogFile="true"
                         endDelimiter=";" />
</changeSet>

и этим (важным!) файлом sql:

CREATE OR REPLACE FUNCTION update_relation( )
    RETURNS void
AS $function$
 declare
 prCrs []%rowtype;
 ngCrs negozio%rowtype;
 begin
        for prCrs in select [...] loop
            with row as (insert into [...] RETURNING * )
            update [...] where id = prCrs.id;
        end loop;
        for ngCrs in select [...] loop
            with row as (insert into [...] RETURNING * )
            update [...] id = ngCrs.id;
        end loop;
    end;
    $function$
    LANGUAGE plpgsql
;

Что изменилось?

  • атрибут типа dbms является строчным;
  • нет имени схемы в имени функции;
  • язык атрибутов БЕЗ апекса и ПОСЛЕ тела;
  • $ function $ в качестве источника тела;
  • last ";"в новой строке.

:-( В Интернете слишком много и слишком много разных примеров. Официальная документация еще хуже ...

сейчас ... теперь это остается длямне узнать, почему он не выполняет его автоматически во втором наборе изменений

...