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

问题描述 投票:0回答:2

编辑:不再需要扩展。您现在可以使用自 PostgreSQL 14 起默认可用的函数

uuid
生成
gen_random_uuid()

我正在开发一个应用程序,我决定在其中使用 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 | [...]

有什么想法吗?

postgresql search-path postgresql-extensions
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;

相关更多解释:


4
投票

如果您在

psql

中运行以下命令
\dx uuid-ossp

您将看到安装扩展(和函数

uuid_generate_v4
)的架构。

确保

  • app_user
    在他的
    search_path
    中有模式(例如,您可以使用
    ALTER USER app_user SET current_schema = ...
    为所有未来的会话更改此模式)。

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

  • app_user
    对扩展模式拥有
    USAGE
    权限。

© www.soinside.com 2019 - 2024. All rights reserved.