Postgresql ERROR: отношения не существует

Вопрос: У меня проблема с триггером/последовательностью postgreSQL Когда я пытаюсь вставить INSERT в таблицу res_letterbox, у меня есть эта ошибка: ERROR: отношения "res_id_mlb_seq" не существует LINE 1: SELECT nextval ('res_id_mlb_seq') QUERY: SELECT nextval ('res_id_mlb_seq') CONTEXT: функция PL/pgSQL users_test.trigger_fct_t_res_letterbox_ins() строка 5 в операторе SQL ********** Ошибка ********** ERROR: отношение "res_id_mlb_seq" не существует Состояние SQL: 42P01 Контекст:

Вопрос:

У меня проблема с триггером/последовательностью postgreSQL

Когда я пытаюсь вставить INSERT в таблицу res_letterbox, у меня есть эта ошибка:

ERROR: отношения “res_id_mlb_seq” не существует
LINE 1: SELECT nextval (‘res_id_mlb_seq’) QUERY: SELECT nextval (‘res_id_mlb_seq’) CONTEXT: функция PL/pgSQL users_test.trigger_fct_t_res_letterbox_ins() строка 5 в операторе SQL

********** Ошибка **********

ERROR: отношение “res_id_mlb_seq” не существует Состояние SQL: 42P01
Контекст: функция PL/pgSQL users_test.trigger_fct_t_res_letterbox_ins() строка 5 в операторе SQL

Я попытался установить прямо в defaut значение столбца res_id: nextval (‘res_id_mlb_seq’ :: regclass) и что он возвращает меня:

ERROR: отношения “res_id_mlb_seq” не существует

CREATE SCHEMA users_test; ALTER SCHEMA users_test OWNER TO users_test; SET search_path = users_test; CREATE TABLE res_letterbox ( res_id bigint, title varchar(255) DEFAULT ‘NULL’, … .. ); CREATE SEQUENCE res_id_mlb_seq INCREMENT 1 MINVALUE 1 NO MAXVALUE START 12602; DROP TRIGGER IF EXISTS t_res_letterbox_ins ON res_letterbox CASCADE; CREATE OR REPLACE FUNCTION trigger_fct_t_res_letterbox_ins() RETURNS trigger AS $BODY$ BEGIN BEGIN SELECT nextval(‘res_id_mlb_seq’) INTO NEW.res_id; EXCEPTION WHEN OTHERS THEN RAISE; END; RETURN NEW; END $BODY$ LANGUAGE ‘plpgsql’; CREATE TRIGGER t_res_letterbox_ins BEFORE INSERT ON res_letterbox FOR EACH ROW EXECUTE PROCEDURE trigger_fct_t_res_letterbox_ins(); ALTER SEQUENCE IF EXISTS res_id_mlb_seq RESTART WITH 12603; Лучший ответ:

users_test вами функция не знает, что она должна найти последовательность в схеме users_test.

Вы можете настроить это, указав search_path при создании функции:

CREATE OR REPLACE FUNCTION trigger_fct_t_res_letterbox_ins() RETURNS trigger AS $BODY$ BEGIN BEGIN SELECT nextval(‘res_id_mlb_seq’) INTO NEW.res_id; EXCEPTION WHEN OTHERS THEN RAISE; END; RETURN NEW; END $BODY$ LANGUAGE ‘plpgsql’ SET search_path = ‘users_test’;

Создайте функциональные документы.

https://www.postgresql.org/docs/9.3/static/sql-createfunction.html

Ответ №1

Вы должны использовать полное имя (со схемой) из функции: SELECT nextval(‘users_test.res_id_mlb_seq’)

Оцените статью
Добавить комментарий