Postgres Ошибка зависимости последовательности запуска функции - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть следующие функции и триггер с настройкой последовательности:

Я хочу создать функцию и триггер, который каждый раз, когда я добавляю новую строку в таблицу STRATEGY_SITES, поле 'SITE_NUM' будет иметь новый порядковый номер из SITENUM_SEQ. Схема называется gismgr.

Я получаю следующую ошибку: Базовая ошибка СУБД [Ошибка: управление достигло конца процедуры триггера без возврата Контекст: PL / pg SQL функция process_sites_edit () (gismgr.strategy_sites) :: SQLSTATE = 2F005] [gismgr.startegy_sites]

CREATE OR REPLACE FUNCTION process_sites_edit() RETURNS TRIGGER AS $SITE_EDIT_TRIGGER$
   begin
            new.SITE_NUM := nextval('gismgr.SITENUM_SEQ');
end;
$SITE_EDIT_TRIGGER$ LANGUAGE 'plpgsql';
create TRIGGER SITE_EDIT_TRIGGER
before insert or update on STRATEGY_SITES for each row
EXECUTE PROCEDURE process_strategy_sites_edit();
CREATE SEQUENCE gismgr."SITENUM_SEQ" owned by gismgr.strategy_Sites.site_num
    INCREMENT 1
    START 19080
    MINVALUE 19080
    MAXVALUE 9999999999999999
    CACHE 20;

1 Ответ

0 голосов
/ 23 февраля 2020

Кажется, это ORACLEism, который не нужен в Postgres. Предполагая, что ваша таблица уже существует, просто

alter table *table_name* alter column site_num default nextval('gismgr.SITENUM_SEQ')

Также убедитесь, что вставка не упоминает столбец site_num. Если вы чувствуете, что должны продолжить использование триггера, ваша функция триггера должна указать возвращаемое значение.

CREATE OR REPLACE FUNCTION process_sites_edit() 
RETURNS TRIGGER AS $SITE_EDIT_TRIGGER$
begin
     new.SITE_NUM := nextval('gismgr.SITENUM_SEQ');
     return new;
end;
$SITE_EDIT_TRIGGER$ LANGUAGE 'plpgsql';

Я также хотел бы предложить вам не запускать триггер при обновлении. Это изменит номер сайта при любом / каждом обновлении данной строки. Если FK ссылается на него - они не будут обновлены, обновление завершится неудачно. Далее выполняемая процедура должна соответствовать имени функции:

create TRIGGER SITE_EDIT_TRIGGER
before insert on STRATEGY_SITES for each row
EXECUTE PROCEDURE process_sites_edit();
...