2016-09-28 177 views
4

我正在开发一个应用程序,其中我决定使用主键和外键的UUID。为此,我使用了在开发环境中正常工作的扩展名“uuid-ossp”。用户不能使用扩展“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 | [...] 

任何想法?

回答

3

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

相关有更多的解释:

+0

在搜索路径中添加了“public”。有效。感谢:) –

+1

我有这个问题,我不断检查我的db_user的搜索路径,它看起来不错,我检查了使用我的admin_user安装扩展的位置,它说它在公共模式。原来,admin_user的默认数据库不同于我为db_user设置的数据库。我使用了'psql -d db_user_database'并在那里添加了扩展名......这样做 – tenCupMaximum

+0

我还从我的用户路径中删除了一些看起来像'$ {user}'(不记得)的东西。不知道什么问题会导致行... – tenCupMaximum

3

如果运行在以下210

\dx uuid-ossp 

你会看到安装扩展(和功能uuid_generate_v4)的模式。

确保

  • app_user具有架构在他的search_path(你可以使用例如ALTER USER app_user SET current_schema = ...改变这所有会话)。

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

  • app_user对扩展架构具有USAGE权限。

+0

你的答案提示我另一个解决方案,也可以工作:'CREATE EXTENSION“uuid-ossp”WITH SCHEMA my_app_user_schema'。 –

+0

@ArnaudDenoyelle:在app_user的模式中安装可能意味着其他用户在其“search_path”中没有该模式。通常*不*你想要什么。扩展通常会进入“公共”模式或您在通用“search_path”中设置的某个专用模式。 –