用户不能使用扩展名" uuid-ossp"

时间:2016-09-28 15:08:21

标签: postgresql search-path postgresql-extensions

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

答案 0 :(得分:5)

您需要在search_path

中安装扩展程序的架构

默认情况下,会在"当前"安装时的架构 - 安装角色的当前search_path设置。

那么你最终在哪里安装它?见How does the search_path influence identifier resolution and the "current schema"

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
...

您可以使用pg_extension.extnamespace重新定位扩展程序:

ALTER EXTENSION uuid-ossp SET SCHEMA public;

与更多解释相关:

答案 1 :(得分:4)

如果您在public void onGrabFrame(TranscoderNativeVideoFrame videoFrame) { BufferedImage image = TranscoderStreamUtils.nativeImageToBufferedImage(videoFrame); if (image != null) { getLogger().info("ModuleTestTranscoderFrameGrab#GrabResult.onGrabFrame: "+image.getWidth()+"x"+image.getHeight()); String storageDir = appInstance.getStreamStoragePath(); File pngFile = new File(storageDir+"/thumbnail.png"); File jpgFile = new File(storageDir+"/thumbnail.jpg"); try { if (pngFile.exists()) pngFile.delete(); ImageIO.write(image, "png", pngFile); getLogger().info("ModuleTestTranscoderFrameGrab#GrabResult.onGrabFrame: Save image: "+pngFile); } catch(Exception e) { getLogger().error("ModuleTestTranscoderFrameGrab.grabFrame: File write error: "+pngFile); } try { if (jpgFile.exists()) jpgFile.delete(); ImageIO.write(image, "jpg", jpgFile); getLogger().info("ModuleTestTranscoderFrameGrab#GrabResult.onGrabFrame: Save image: "+jpgFile); } catch(Exception e) { getLogger().error("ModuleTestTranscoderFrameGrab.grabFrame: File write error: "+jpgFile); } } }

中运行以下内容
psql

您将看到安装扩展程序(以及函数\dx uuid-ossp )的架构。

确保

  • uuid_generate_v4app_user中有架构(例如,您可以使用search_path为以后的所有会话更改此内容。)

  • ALTER USER app_user SET current_schema = ...具有执行该功能的权限(默认情况下通常允许这样做)。

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