用户不能使用扩展“uuid-ossp”
我正在开发一个应用程序,其中我决定使用主键和外键的UUID。为此,我使用了在开发环境中正常工作的扩展名“uuid-ossp”。用户不能使用扩展“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 | [...]
任何想法?
您需要在您的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;
相关有更多的解释:
如果运行在以下210
\dx uuid-ossp
你会看到安装扩展(和功能uuid_generate_v4
)的模式。
确保
app_user
具有架构在他的search_path
(你可以使用例如ALTER USER app_user SET current_schema = ...
改变这所有会话)。app_user
有权执行该功能(默认情况下通常是允许的)。app_user
对扩展架构具有USAGE
权限。
你的答案提示我另一个解决方案,也可以工作:'CREATE EXTENSION“uuid-ossp”WITH SCHEMA my_app_user_schema'。 –
@ArnaudDenoyelle:在app_user的模式中安装可能意味着其他用户在其“search_path”中没有该模式。通常*不*你想要什么。扩展通常会进入“公共”模式或您在通用“search_path”中设置的某个专用模式。 –
在搜索路径中添加了“public”。有效。感谢:) –
我有这个问题,我不断检查我的db_user的搜索路径,它看起来不错,我检查了使用我的admin_user安装扩展的位置,它说它在公共模式。原来,admin_user的默认数据库不同于我为db_user设置的数据库。我使用了'psql -d db_user_database'并在那里添加了扩展名......这样做 – tenCupMaximum
我还从我的用户路径中删除了一些看起来像'$ {user}'(不记得)的东西。不知道什么问题会导致行... – tenCupMaximum