用户无法使用扩展名"uuid-ossp"。

15

编辑:不再需要扩展了。您现在可以使用函数gen_random_uuid()生成UUID,该函数自PostgreSQL 14起默认可用。

我正在开发一个应用程序,决定使用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个回答

15
你需要在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;

更多解释请参考以下内容:


将“public”添加到搜索路径中。它起作用了。谢谢 :) - Arnaud Denoyelle
1
我曾经遇到过这个问题,一直在检查我的db_user的搜索路径,看起来没问题,我用我的admin_user检查了扩展安装的位置,它说它在public模式中。结果发现admin_user的默认数据库与我为db_user设置的不同。我使用psql -d db_user_database并在那里添加了扩展...问题解决了。 - crackpotHouseplant
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - crackpotHouseplant

4
如果您在psql中运行以下内容:
\dx uuid-ossp

您将看到已安装扩展程序(以及函数uuid_generate_v4)的模式。
请确保:
  • app_user在他的search_path中有该模式(例如,您可以使用ALTER USER app_user SET current_schema = ...来更改所有未来会话的设置)。

  • app_user有执行该函数的权限(通常默认允许)。

  • app_user在扩展模式上具有USAGE权限。


1
你的回答给了我另一个可行的解决方案:CREATE EXTENSION "uuid-ossp" WITH SCHEMA my_app_user_schema - Arnaud Denoyelle
@ArnaudDenoyelle:在app_user模式中安装可能意味着其他用户在其“search_path”中没有该模式。通常不是您想要的。扩展通常放置在“public”模式或一些您在通用“search_path”中设置的专用模式中。 - Erwin Brandstetter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接