我正在开发一个应用程序,我决定在其中使用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 | [...]
有什么想法吗?
答案 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_v4
在app_user
中有架构(例如,您可以使用search_path
为以后的所有会话更改此内容。)
ALTER USER app_user SET current_schema = ...
具有执行该功能的权限(默认情况下通常允许这样做)。
app_user
对扩展架构具有app_user
权限。