PostgreSQL运行setup.sh调用lo_import函数报权限被拒绝错误
问题原因
lo_import是PostgreSQL服务端执行的函数,读取文件时使用的是PostgreSQL服务进程的系统用户(通常为postgres)权限,而非执行psql客户端的用户权限。你手动执行INSERT命令时大概率默认使用了PostgreSQL超级用户(如postgres)登录,而脚本中指定使用普通角色admin执行,默认普通角色没有lo_import的执行权限。- 你授予的
GRANT ALL PRIVILEGES ON DATABASE mydb to admin仅覆盖数据库层面的基础权限,不包含大对象操作、服务端文件读取的相关权限。 - 路径权限限制:Mac系统下
/Users/myname/用户目录默认对其他用户关闭访问权限,即使图片本身权限为755,postgres服务用户也无法访问上层目录,也会触发权限报错。
解决方案
以下三个方案可按需选择:
方案1:给admin角色补全权限+调整路径权限
- 在
db_setup.sql中添加权限授予语句:
GRANT EXECUTE ON FUNCTION lo_import(text) TO admin; GRANT USAGE, CREATE ON LARGE OBJECT TO admin;
- 调整图片所在目录的权限,允许postgres用户访问:
chmod o+x /Users/myname /Users/myname/this-folder
方案2:改用客户端侧的\lo_import导入(更安全)
直接修改seed_data.sql内容,使用psql客户端命令导入文件,绕过服务端文件读取限制,无需额外开放权限:
\lo_import '/Users/myname/this-folder/some-image-name.png' INSERT INTO mydb(name, raster) VALUES('Herald', :LASTOID);
方案3:临时使用超级用户执行初始化
如果是一次性初始化场景,可直接修改setup.sh中第三条psql命令的登录用户为postgres超级用户,执行完成后再使用admin用户进行日常操作。
内容的提问来源于stack exchange,提问作者stk1234
相关产品推荐
相关产品推荐

