EDIT:不再需要扩展了。现在你可以用gen_random_uuid()
函数生成一个uuid
,这个函数从PostgreSQL 14开始默认可用。
我正在开发一个应用程序,我决定使用UUID作为主键和外键。为此,我使用了扩展名“uuid-ossp”,它在开发环境中工作得很好。
现在,我正在安装测试环境。数据库设置由客户制作的脚本强制执行。结构是标准的:管理员用户、应用程序用户、应用程序命名空间等。
我可以使用admin帐户创建扩展:
$ 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条答案
按热度按时间nbewdwxp1#
您需要在
search_path
中安装扩展的模式。默认情况下,扩展在安装时安装到“当前”模式-安装角色的当前
search_path
设置。那么您最后将它安装在哪里呢?请参见
pg_extension.extnamespace
:可以使用
ALTER EXTENSION
重新定位扩展:与更多解释相关:
yizd12fk2#
如果在
psql
中运行以下命令您将看到安装扩展(和函数
uuid_generate_v4
)的模式。确保
app_user
在其search_path
中具有该模式(例如,您可以使用ALTER USER app_user SET current_schema = ...
为所有未来会话更改此模式)。app_user
具有执行该函数的权限(默认情况下通常允许)。app_user
对扩展模式具有USAGE
权限。