Postgresql 用户不能使用扩展名“;uuid ossp“;
我正在开发一个应用程序,其中我决定对主键和外键使用UUID。为此,我使用了扩展“uuid ossp”,它在开发环境中运行良好 现在,我正在安装测试环境。数据库设置由客户制作的脚本强制执行。结构是标准的:管理用户、应用程序用户、应用程序命名空间等 我可以使用管理员帐户创建扩展:Postgresql 用户不能使用扩展名“;uuid ossp“;,postgresql,search-path,postgresql-extensions,Postgresql,Search Path,Postgresql Extensions,我正在开发一个应用程序,其中我决定对主键和外键使用UUID。为此,我使用了扩展“uuid ossp”,它在开发环境中运行良好 现在,我正在安装测试环境。数据库设置由客户制作的脚本强制执行。结构是标准的:管理用户、应用程序用户、应用程序命名空间等 我可以使用管理员帐户创建扩展: $ psql mydb -U [admin_user] mydb=# CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; CREATE EXTENSION mydb=# select
$ 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_用户和app_用户都在同一个数据库中。app_用户可以“查看”扩展,但不能使用它:
bdd3001=> select * from pg_catalog.pg_extension;
extname | [...]
-----------+-
plpgsql | [...]
uuid-ossp | [...]
有什么想法吗?您需要在
搜索路径中安装扩展的架构
默认情况下,在安装时将扩展安装到“当前”架构-安装角色的当前search\u路径设置
那么你最后在哪里安装的呢?见:
您可以通过以下方式重新定位扩展:
与更多解释相关:
如果在psql
\dx uuid-ossp
您将看到安装扩展(以及函数uuid\u generate\u v4
)的模式
确保
app\u user
在其search\u路径中具有架构(例如,您可以使用ALTER user app\u user SET current\u schema=…
为所有未来会话更改此架构)
app\u用户
具有执行该功能的权限(默认情况下通常允许)
app\u用户
在扩展架构上具有USAGE
权限
在搜索路径中添加了“public”。成功了。谢谢:)我遇到了这个问题,我一直在检查我的db_用户的搜索路径,它看起来很正常,我用我的admin_用户检查了扩展的安装位置,它说它在公共架构中。结果是admin_用户的默认数据库与我为db_用户设置的数据库不同。我使用了psql-ddb\u user\u数据库
,并在那里添加了扩展。。。确实如此,itI还从我的用户路径中删除了类似于${user}
(不记得了)的内容。不知道会导致什么问题……您的回答向我建议了另一个同样有效的解决方案:使用模式my_app_user_SCHEMA创建扩展“uuid ossp”
@ArnaudDenoyelle:在应用程序用户的模式中安装可能意味着其他用户的搜索路径中没有该模式。通常不是你想要的。扩展通常进入公共
模式或在常规搜索路径
中设置的某些专用模式。
ALTER EXTENSION uuid-ossp SET SCHEMA public;
\dx uuid-ossp