在Ubuntu上将CSV导入Postgres时,复制权限被拒绝

时间:2015-08-13 22:20:33

标签: postgresql csv ubuntu-14.04

我在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

这是终端的屏幕截图:

enter image description here

为什么\copy无法在这里工作?

3 个答案:

答案 0 :(得分:3)

你肯定要更改一些权限,因为Postgres无法读取你的文件。 Postgres与您的用户不同,因此如果您没有赋予其权利,它就无法读取您的文件。只有在您运行psql命令的用户而不是postgres的设置时,\ copy解决方案才有效。

你总是可以制作文件的副本,将文件的权限分配给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-------

然后以下两种解决方案中的任何一种都可以使用。

  1. 如果您不想更改所有用户的权限并且您拥有更多权限,则可以执行

    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
    
  2. 如果您不介意所有用户都读取您的文件,那么您可以执行(作为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
    

    如果这些解决方案都不适合您,请使用上面第一个命令的输出进行评论。

答案 1 :(得分:1)

未经许可的终端替代

pg documentation at NOTES

  

路径将相对于服务器进程的工作目录(通常是群集的数据目录)进行解释,而不是客户端的工作目录。

因此,从字面上看,使用psql或任何客户端,即使在本地服务器中,也存在问题......并且,如果您正在为其他用户表达COPY命令,例如。在Github自述文件中,读者会有问题......

表达具有客户端权限的相对路径的唯一方法是使用 STDIN

  

当指定STDIN或STDOUT时,数据通过客户端和服务器之间的连接传输。

remembered here

psql -h remotehost -d remote_mydb -U myuser -c \
   "copy mytable from STDIN with delimiter as ','" \
   < ./relative_path/file.csv

答案 2 :(得分:0)

您似乎正在尝试从其他人的主目录中读取文件。

通常,主目录或其中的目录上的权限不可能或不允许这样做。它与PostgreSQL没有任何关系;你会发现:

cat /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv

会产生同样的错误。

如果您的安全要求允许,您可以更改该路径的权限。否则,只需将其复制到/tmp并从那里导入即可。

相关问题