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

Postgresql \在Ubuntu上将CSV导入Postgres时,复制权限被拒绝,postgresql,csv,ubuntu-14.04,Postgresql,Csv,Ubuntu 14.04,我在Ubuntu 14.04上使用Postgres,我一直在尝试将一个csv文件导入Postgres中一个名为“weather”的表中。我已经查看了这个问题,并尝试使用\copy命令而不是常规的复制,但仍然得到相同的权限被拒绝错误 我有点犹豫是否要为所有用户修改该目录下所有文件的所有权权限(如第一个答案中所建议的)。以下是副本声明: \copy weather from '/home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQ

我在Ubuntu 14.04上使用Postgres,我一直在尝试将一个csv文件导入Postgres中一个名为“weather”的表中。我已经查看了这个问题,并尝试使用
\copy
命令而不是常规的复制,但仍然得到相同的
权限被拒绝
错误

我有点犹豫是否要为所有用户修改该目录下所有文件的所有权权限(如第一个答案中所建议的)。以下是副本声明:

\copy weather from '/home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv' HEADER DELIMITER ',' CSV
这是终端的屏幕截图:


为什么
\copy
在这里不起作用?

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

您可以始终复制该文件,在Postgres可以执行的目录中将该文件的权限分配给用户Postgres,然后删除该文件,或者您可以执行以下操作:

您必须更改的内容取决于此命令的输出(以user1身份运行):

(如果尚未安装此命令,则在运行此命令之前,您可能需要
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权限)

    我建议您使用此解决方案。它只会更改该文件的权限,以便计算机上的所有用户都可以读取该文件。然而,尽管默认情况下linux中的大多数目录都可以由任何人打开,但如果不是所有用户都对您的目录具有执行权限,则这可能无法工作

    当然,一旦您读取了该文件,就可以使用再次限制权限

    chmod a-r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
    
    如果这两种解决方案都不适合您,请使用上面第一个命令的输出进行评论


  • 似乎您正试图从其他人的主目录中读取文件

    通常,这是不可能的,或者是他们的主目录或其中的目录的权限所不允许的。这与PostgreSQL无关;你会发现:

    cat /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
    
    产生相同的错误

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

    由终端选择,无需许可 说

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

    因此,gerally,使用
    psql
    或任何客户端,即使在本地服务器中,您也会遇到问题。。。而且,如果您正在为其他用户表达COPY命令,例如在Github自述文件中,读者将遇到问题

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

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

    作为:

    psql-h remotehost-d remote\U mydb-U myuser-c\
    从STDIN复制mytable,分隔符为“,”\
    <./相对路径/file.csv
    
    查看屏幕截图。用户正在以自己的用户身份运行
    \copy
    +1无论如何,对于
    namei
    命令,我已经使用Linux 15年了,并不知道它。感谢+1,但他们正在以postgres的形式运行它。看
    sudo-i-u postgres
    Whoops,你说得对,我是瞎子。很抱歉我恳求-在澳大利亚这里的早晨。@user156213:谢谢你的详细回答。我刚刚运行了
    namei
    命令并获得了文件权限输出。Dropbox文件夹似乎没有以
    x
    结尾。在此之后,我是否仍可以运行您提供的两个解决方案中的任何一个,或者我是否应该更改某些内容?这里是输出的屏幕截图:另外,我是这台计算机上唯一的用户(user1)。@user156213:我设法通过终端通过
    add user
    命令设置了一个新用户,并且具有管理员访问权限,这样我就不会遇到当用户是postgres时发生的管理问题。但是我不知道如何使用这个新用户连接到Postgres,而不是
    sudo-I-u Postgres
    。这是如何工作的?但是
    cat
    命令不会向我抛出错误。以下是输出的屏幕截图:。。我是否应该使用
    cp
    命令将csv文件复制到
    \tmp
    ?@Manish,这是因为您必须使用
    postgres
    来运行
    psql
    ,而不是
    cat
    。如果您以
    postgres
    身份运行,它将运行。
    /tmp
    文件夹是否始终是可访问的文件夹?我试过了,但不起作用。。可能该文件夹放在其他地方,或者我需要在配置文件中注册它?@Vass
    /tmp
    始终可供所有用户访问,但
    /tmp
    中的文件和目录可能具有更严格的权限
    chmod a-r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
    
    cat /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
    
    psql -h remotehost -d remote_mydb -U myuser -c \
       "copy mytable from STDIN with delimiter as ','" \
       < ./relative_path/file.csv