postgresql 用户无法使用扩展名“uuid-ossp”

mwngjboj  于 2023-03-17  发布在  PostgreSQL
关注(0)|答案(2)|浏览(348)

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 | [...]

有什么想法吗?

nbewdwxp

nbewdwxp1#

您需要在search_path中安装扩展的模式。
默认情况下,扩展在安装时安装到“当前”模式-安装角色的当前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;

与更多解释相关:

  • 是否建议将扩展安装到pg_catalog模式中?
yizd12fk

yizd12fk2#

如果在psql中运行以下命令

\dx uuid-ossp

您将看到安装扩展(和函数uuid_generate_v4)的模式。
确保

  • app_user在其search_path中具有该模式(例如,您可以使用ALTER USER app_user SET current_schema = ...为所有未来会话更改此模式)。
  • app_user具有执行该函数的权限(默认情况下通常允许)。
  • app_user对扩展模式具有USAGE权限。

相关问题