#postgresql #triggers #postgis #pg-dump #pg-restore
#postgresql #триггеры #postgis #pg-дамп #pg-восстановление
Вопрос:
Postgres 12, Postgis 3
Изначально определены два триггера с критериями WHEN (OLD.geom IS DISTINCT FROM NEW.geom)
. Столбец geom имеет тип geometry
.
Это вызвало проблемы при pg_restore базы данных из-за недоступности оператора геометрии для equals:
pg_restore: while PROCESSING TOC:
pg_restore: from TOC entry 10233; 2620 673186 TRIGGER lines the_trigger_name geo
pg_restore: error: could not execute query: ERROR: operator is not unique: public.geometry = public.geometry
LINE 1: ...public.lines FOR EACH ROW WHEN ((old.geom IS DISTINC...
^
HINT: Could not choose a best candidate operator. You might need to add explicit type casts.
Command was: CREATE TRIGGER the_trigger_name AFTER UPDATE ON public.lines FOR EACH ROW WHEN ((old.geom IS DISTINCT FROM new.geom)) EXECUTE FUNCTION public.the_function_name();
Резервная база данных использует postgis 3.0.0
Мы загружаем его двумя разными способами:
- в одной среде (postgis 3.0.1) мы используем дамп базы данных в формате обычного текста (по умолчанию) (
pg_dump -F p
) и загружаем его, просто выполняя текстовый файл, напримерpsql -f /my/file.sql
- это сообщение об ошибке, но загрузка базы данных все еще работает
- в другой среде (postgis 3.0.2) мы используем дамп базы данных в пользовательском формате (
pg_dump -F custom
) и загружаем его, выполнивpg_restore --single-transaction < “$DB_FILE”
- это сообщение об ошибке и сбой
Добавление ::geometry
приведения к СТАРОМУ / НОВОМУ geom устраняет эту проблему. Почему pg не может определить оператор равенства в определенных контекстах (без приведения типов)?