11

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

有任何想法吗?

4

2 回答 2

12

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

与更多解释相关:

于 2016-09-28T15:20:09.027 回答
4

如果您在psql

\dx uuid-ossp

您将看到uuid_generate_v4安装了扩展(和函数)的架构。

确保

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

  • app_user具有执行功能的权限(通常默认允许)。

  • app_user具有USAGE扩展架构的特权。

于 2016-09-28T15:31:10.767 回答