我在 Ubuntu 14.04 上使用 Postgres,我一直在尝试将一个 csv 文件导入到 Postgres 中名为“天气”的表中。我看过问题 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
在这里不起作用?
最佳答案
您肯定必须更改一些权限,因为 Postgres 无法读取您的文件。 Postgres 和你是不同的用户,所以如果你不给它权限,它就不能读取你的文件。\copy 解决方案只有在你的设置中你而不是 postgres 是运行 psql
命令的用户时才有效。
您始终可以制作该文件的副本,将该文件的权限分配给 Postgres 可以执行的目录中的用户 Postgres,然后删除该文件,或者您可以这样做:
您必须更改的内容取决于此命令的输出(以 user1 身份运行):
namei -l /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
(如果尚未安装,您可能需要在运行此命令之前sudo apt-get install util-linux
)
此命令将列出文件及其所有父目录的当前权限,以便我们找到解决方案。
假设所有目录都有以“x”结尾的条目,如下所示:
drwxr-xr-x user group filename
drwxr-xr-x
drwxr-xr-x
-rw-------
那么以下两种解决方案中的任何一种都可以。
如果您不想更改所有用户的权限并且您有 sudoer 权限,您可以这样做
sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv postgresql
但是,这种方法会撤销您对该文件的访问权限,这可能是您不希望看到的。但是你总是可以在完成导入后将文件返回给你
sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv user1
如果您不介意所有用户都读取您的文件,那么您可以执行(作为 user1 并且没有 root 权限)
chmod a+r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
我建议您执行此解决方案。它只会更改该文件的权限,以便您计算机上的所有用户都可以读取它。然而,虽然默认情况下在 Linux 中大多数目录都可以被任何人打开,但如果不是所有用户都对您的目录具有执行权限,这就有可能不起作用。
当然,一旦您阅读了该文件,您始终可以再次限制权限
chmod a-r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
如果这些解决方案都不适合您,请对上面第一个命令的输出进行评论。
关于postgresql -\复制权限在将 CSV 导入 Ubuntu 上的 Postgres 时被拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31999387/