PostgreSQL调用pg_read_binary_file时权限拒绝问题排查
你遇到的错误:
ERROR: could not open file "C:/Users/User1/Documents/VS Code/Public/Ecom_Mahjong/client/src/assets/products/Shirt3.png" for reading: Permission denied
对应的SQL语句:
INSERT INTO products(product, description, price, image) VALUES ('Mahjong Hoodie', ' Stay cozy in style with our Mahjong-themed hoodie, featuring intricate tile designs and a comfortable fit for all-day gaming sessions.', 24.99, pg_read_binary_file('C:\Users\User1\Documents\VS Code\Public\Ecom_Mahjong\client\src\assets\products\Shirt3.png') );
需要检查以下几个点来解决问题:
PostgreSQL服务账号的文件访问权限
PostgreSQL作为系统服务运行,使用专用系统账号(Windows下通常是NT SERVICE\postgresql-x64-XX,XX为版本号)。需给该账号授予图片文件及所有上级文件夹的读取权限:右键目标文件/文件夹 → 属性 → 安全选项卡 → 编辑 → 添加 → 输入服务账号名称 → 勾选“读取”权限 → 保存应用。文件路径格式正确性
SQL语句里的反斜杠\需要转义为\\,或直接改用正斜杠/避免路径解析错误。比如修改为:'C:/Users/User1/Documents/VS Code/Public/Ecom_Mahjong/client/src/assets/products/Shirt3.png'
或'C:\\Users\\User1\\Documents\\VS Code\\Public\\Ecom_Mahjong\\client\\src\\assets\\products\\Shirt3.png'检查
secure_file_priv参数限制
PostgreSQL的secure_file_priv参数会限制pg_read_binary_file的读取范围:- 执行
SHOW secure_file_priv;查询当前设置; - 如果返回特定目录,需将图片移至该目录,或修改
postgresql.conf中secure_file_priv值为''(空字符串,允许读取任意文件),之后重启PostgreSQL服务; - 如果返回
null,则完全禁止读取外部文件,必须修改参数后重启服务。
- 执行
文件是否被其他程序占用
若目标图片正在被VS Code、图片查看器等程序打开,会导致PostgreSQL无法读取,关闭这些占用程序后再尝试执行SQL。
内容的提问来源于stack exchange,提问作者jrdaz14

