我已经尝试将一个csv文件导入到Postgres中名为'weather'的表中 . 我查看了问题Postgres ERROR: could not open file for reading: Permission denied并尝试使用 \copy
命令而不是常规副本,但我仍然得到相同的 Permission Denied
错误 .
我有点犹豫是否要为所有用户修改该目录的所有文件的所有权权限(如第一个答案中所建议的) . 这是复制声明:
\copy weather from '/home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv' HEADER DELIMITER ',' CSV
这是终端的截图:
为什么 \copy
在这里不起作用?
3 回答
你肯定要改变一些权限,因为如果你不给它权利,Postgres可以't read your file. Postgres is a different user from you, so it can't读取你的文件 . 只有当你运行
psql
命令的 you 而不是postgres的设置时,\ copy解决方案才有效 .您可以随时制作文件的副本,将文件的权限分配给Postgres可以执行的目录中的用户Postgres,然后删除该文件,或者您可以这样做:
您需要更改的内容取决于此命令的输出(以user1身份运行):
(在运行此命令之前,您可能需要
sudo apt-get install util-linux
,如果尚未安装)此命令将列出文件及其所有父目录的当前权限,以便我们可以找到解决方案 .
假设所有目录都有以“x”结尾的条目,如下所示:
那么下面两个解决方案中的任何一个都可行 .
但是,此方法将撤消您对文件的访问权限,这可能是您不想要的 . 但是,在您完成导入后,您可以随时将文件chown给您
我建议你做这个解决方案 . 它只会更改该文件的权限,以便计算机上的所有用户都可以读取它 . 但是,虽然在Linux中默认情况下,大多数目录都可以由任何人打开,但如果并非所有用户都对您的目录具有执行权限,则可能无法正常工作 .
当然,一旦您阅读了该文件,您就可以随时再次限制权限
如果这些解决方案都不适合您,请使用上面第一个命令的输出进行注释 .
终端替代,未经许可
pg documentation at NOTES说
因此,从字面上看,使用
psql
或任何客户端,即使在本地服务器中,也存在问题......并且,如果您正在为其他用户表达COPY命令,例如 . 在Github自述文件中,读者会遇到问题......表达 relative path with client permissions 的唯一方法是使用STDIN,
as remembered here:
您似乎正在尝试从其他人的主目录中读取文件 .
通常,这对主目录或其中的目录的权限是不可能或不允许的 . 这跟PostgreSQL没什么关系;你会发现:
产生相同的错误 .
如果您的安全要求允许,您可以更改该路径上的权限 . 否则,只需将其复制到
/tmp
并从那里导入 .