Postgres не следует search_path для поиска таблиц

Я не уверен, в какой именно момент это началось (я полагаю, это могло произойти после первого запуска pgadmin3). По сути, это произошло внезапно, и вроде бы все настроено правильно ..

PostgreSQL, похоже, больше не следует search_path для поиска моих таблиц.

\d
No relations found.

Мой путь поиска задан (при этом постоянно):

SHOW search_path;
"public, myschema1, myschema2"
(1 row)

Я не только владелец рассматриваемых таблиц, но и выполнил:

GRANT ALL ON SCHEMA public to myusername;
GRANT ALL ON SCHEMA myschema1 to myusername;
GRANT ALL ON SCHEMA myschema2 to myusername;

Все данные есть. Я вижу схемы при запуске \ dn. Я также могу выполнять запросы, если полностью уточню имена схемы и таблицы. Самая большая проблема заключается в том, что уже созданные функции, которые ссылаются на неквалифицированное имя таблицы, не будут работать.

Может ли кто-нибудь придумать то, что я, возможно, не пробовал? Любые мысли относительно того, что вызвало появление этой проблемы?

Спасибо за любую помощь! -высокие технологии


person hightech    schedule 31.07.2013    source источник
comment
У меня пока недостаточно очков, чтобы отметить этот ответ, но: Проблема была с моим search_path. Он был установлен с использованием кавычек, что заставляет postgres думать, что это полное имя схемы ... Правильная команда: SET search_path = public, myschema1, myschema2 НЕ SET search_path = 'public, myschema1, myschema2'   -  person hightech    schedule 01.08.2013


Ответы (2)


Вероятно, вы ввели search_path как одну строку

postgres=# set search_path to public, s1;
SET
postgres=# show search_path ;
 search_path 
-------------
 public, s1
(1 row)

postgres=# set search_path to 'public, s1';
SET
postgres=# show search_path ;
 search_path  
--------------
 "public, s1"
(1 row)

вторая настройка неверна и не работает.

person Pavel Stehule    schedule 31.07.2013
comment
Нет, вы должны увидеть все таблицы в схемах, которые находятся в вашем search_path. - person hightech; 31.07.2013
comment
@hightech, у тебя правда есть другой баг. - person Pavel Stehule; 01.08.2013

Я исправил аналогичную проблему, GRANT, что пользователь USAGE ON SCHEMA вошел в систему как OWNER в этой схеме. Позвольте мне развить:

История пользователя: я мог воспроизвести это странное поведение с помощью Postgres 9.6, см. Вывод консоли ниже. Насколько это было странно? Мог \dt preprod.users, но \dt только ничего не выдаст! Я также мог ВЫБРАТЬ на этих таблицах, что меня действительно сбивало с толку.

(В search_path обратите внимание на пробел после запятой, автоматически корректируемый PostgreSQL)

do_preprod=> -- I'm logged on as preprod_www_ro, a read-only user who belongs to readonly ROLE.
do_preprod=> SET search_path TO preprod,public;
SET
do_preprod=> SHOW search_path;
   search_path
-----------------
 preprod, public
(1 row)
do_preprod=> \dt
Did not find any relations.
do_preprod=> \dt users;
Did not find any relation named "users".
do_preprod=> \dt preprod.users;
           List of relations
 Schema  | Name  | Type  |    Owner
---------+-------+-------+-------------
 preprod | users | table | preprod_www
(1 row)

Затем, войдя в систему как preprod_www (= владелец схемы), я ПРЕДОСТАВИЛ readonly ROLE (preprod_www_ro's) привилегию USAGE. do_preprod => РАЗРЕШИТЬ ИСПОЛЬЗОВАНИЕ НА препрод СХЕМЫ ТОЛЬКО для чтения;

Затем, когда я был в preprod_www_ro, я мог сразу увидеть отношения с \dt, полностью наслаждаясь своим search_path, без необходимости выходить из системы и снова входить в систему.

В первую очередь, мне бы хотелось получить более четкое сообщение от PostgreSQL при выдаче \dt или \dt preprod.users: «ИСПОЛЬЗОВАНИЕ НА СХЕМЕ не разрешено ...» или что-то в этом роде, поскольку на самом деле этот пользователь МОЖЕТ использовать его ... но не полностью плавно.

person Fabien Haddadi    schedule 04.09.2019