Пользователь не может использовать расширение "uuid-ossp"

Я разрабатываю приложение, в котором я решил использовать UUID для первичного и внешнего ключей. Для этого я использовал расширение "uuid-ossp", которое отлично работает в среде разработки.

Сейчас я устанавливаю среду тестирования. Настройка базы данных осуществляется с помощью скрипта, сделанного заказчиком. Структура стандартная: администратор, пользователь приложения, пространство имен приложения и т. Д.

Я могу создать расширение с учетной записью администратора:

$ psql mydb -U [admin_user]

mydb=# CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE EXTENSION

mydb=# select uuid_generate_v4();
        uuid_generate_v4
--------------------------------------
 23e45b57-a658-41a5-8661-0cc06568eff8

Но когда я соединяюсь с пользователем приложения базы данных, я не могу сгенерировать uuid:

$ psql mydb -U [app_user]

SELECT uuid_generate_v4();

mydb=> select uuid_generate_v4();
ERROR:  function uuid_generate_v4() does not exist

И admin_user, и app_user находятся в одной базе данных. App_user может "видеть" расширение, но не использовать его:

bdd3001=> select * from pg_catalog.pg_extension;
  extname  | [...]
-----------+-
 plpgsql   | [...]
 uuid-ossp | [...]

Есть идеи?

2 ответа

Решение

Вам нужна схема, для которой вы установили расширение в search_path,

По умолчанию расширение устанавливается в "текущую" схему во время установки - текущую search_path установка роли установки.

Так где же вы закончили установку? Увидеть pg_extension.extnamespace:

SELECT e.extname
     , n.nspname      AS home_schema_of_extension
     , extrelocatable AS extension_can_be_relocated
FROM   pg_catalog.pg_extension e
JOIN   pg_catalog.pg_namespace n ON n.oid = e.extnamespace;

extname   | home_schema_of_extension | extension_can_be_relocated
----------+--------------------------+---------------------------
plpgsql   | pg_catalog               | f
intarray  | public                   | t
tablefunc | public                   | t
pg_trgm   | public                   | t
...

Вы можете переместить расширение с помощью ALTER EXTENSION:

ALTER EXTENSION uuid-ossp SET SCHEMA public;

Связано с дополнительным объяснением:

Если вы запустите следующее в psql

\dx uuid-ossp

Вы увидите схему, где расширение (и функция uuid_generate_v4) установлено.

Удостоверься что

  • app_user имеет схему в своем search_path (Вы можете, например, использовать ALTER USER app_user SET current_schema = ... изменить это для всех будущих сессий).

  • app_user имеет разрешение на выполнение функции (обычно это разрешено по умолчанию).

  • app_user имеет USAGE привилегия на схему расширения.

Другие вопросы по тегам