PostgreSQL使用COPY命令导入CSV文件报权限被拒绝错误是什么原因?
错误原因
- PostgreSQL原生的
COPY FROM是服务端运行的命令,执行读取文件操作的是PostgreSQL的服务进程,不是你当前操作客户端的用户:Windows环境下PostgreSQL服务默认使用NETWORK SERVICE账号运行,该账号默认没有权限访问你的个人用户目录C:\Users\HI\AppData\Local\Temp,因此触发权限不足报错,对应SQL状态42501就是权限类错误编码。 - 你的文件路径包含
.zip后缀,说明你尝试直接读取压缩包内的文件,未将CSV文件解压到本地目录,PostgreSQL服务不支持直接读取压缩包内的文件。
解决方法
方案1:使用客户端侧的\copy命令(推荐,无需修改权限配置)
\copy是psql客户端提供的命令,使用当前登录系统的用户权限读取本地文件,不需要给PostgreSQL服务账号开放目录权限,语法和原生COPY几乎一致,直接在psql命令行执行以下命令即可:
\copy studentlist(stname,email,birth,entrydate,gender,classnum ) FROM '替换为解压后的CSV实际路径' DELIMITER ',' CSV HEADER
注意:
- 执行前需要先把
students.csv文件从压缩包中解压到本地任意目录,将上述命令中的路径替换为解压后的实际文件路径 \copy命令不需要以分号结尾
方案2:调整权限继续使用原生COPY命令
如果必须使用原生COPY命令,按以下步骤操作:
- 把
students.csv从压缩包中解压到一个公共可读目录,例如C:\public_sql_data - 右键点击该目录,选择「属性」-「安全」,给
NETWORK SERVICE(或你PostgreSQL服务实际运行的账号)授予该目录的「读取和执行」、「列出文件夹内容」权限 - 修改你的COPY命令中的文件路径为解压后的路径,Windows环境建议使用正斜杠避免转义问题,示例:
COPY studentlist(stname,email,birth,entrydate,gender,classnum ) FROM 'C:/public_sql_data/students.csv' DELIMITER ',' CSV HEADER;
内容的提问来源于stack exchange,提问作者Opoke Loveth
相关产品推荐
相关产品推荐

