用户不能使用扩展 "uuid-ossp"
User cannot use extension "uuid-ossp"
我正在开发一个应用程序,我决定在其中为主键和外键使用 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 可以 "see" 扩展但不能使用它:
bdd3001=> select * from pg_catalog.pg_extension;
extname | [...]
-----------+-
plpgsql | [...]
uuid-ossp | [...]
有什么想法吗?
您需要在 search_path
.
中安装扩展的架构
默认情况下,扩展会在安装时安装到 "current" 架构 - 安装角色的当前 search_path
设置。
- How does the search_path influence identifier resolution and the "current schema"
那么你最终安装在哪里?见 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;
相关更多解释:
如果你运行以下psql
\dx uuid-ossp
您将看到安装扩展(和函数 uuid_generate_v4
)的架构。
确保
app_user
在他的 search_path
中有架构(例如,您可以使用 ALTER USER app_user SET current_schema = ...
为以后的所有会话更改此架构)。
app_user
有执行函数的权限(一般默认是允许的)
app_user
对扩展架构具有 USAGE
特权。
我正在开发一个应用程序,我决定在其中为主键和外键使用 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 可以 "see" 扩展但不能使用它:
bdd3001=> select * from pg_catalog.pg_extension;
extname | [...]
-----------+-
plpgsql | [...]
uuid-ossp | [...]
有什么想法吗?
您需要在 search_path
.
默认情况下,扩展会在安装时安装到 "current" 架构 - 安装角色的当前 search_path
设置。
- How does the search_path influence identifier resolution and the "current schema"
那么你最终安装在哪里?见 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;
相关更多解释:
如果你运行以下psql
\dx uuid-ossp
您将看到安装扩展(和函数 uuid_generate_v4
)的架构。
确保
app_user
在他的search_path
中有架构(例如,您可以使用ALTER USER app_user SET current_schema = ...
为以后的所有会话更改此架构)。app_user
有执行函数的权限(一般默认是允许的)app_user
对扩展架构具有USAGE
特权。