Пользователь не может использовать расширение "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
привилегия на схему расширения.