首页 文章

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

提问于
浏览
2

我已经尝试将一个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

这是终端的截图:

enter image description here

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

3 回答

  • 1

    你肯定要改变一些权限,因为如果你不给它权利,Postgres可以't read your file. Postgres is a different user from you, so it can't读取你的文件 . 只有当你运行 psql 命令的 you 而不是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-------
    

    那么下面两个解决方案中的任何一个都可行 .

    • 如果您不想更改所有用户的权限并且您拥有更多权限,则可以执行此操作
    sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv postgresql
    

    但是,此方法将撤消您对文件的访问权限,这可能是您不想要的 . 但是,在您完成导入后,您可以随时将文件chown给您

    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
    

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

  • 0

    终端替代,未经许可

    pg documentation at NOTES

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

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

    表达 relative path with client permissions 的唯一方法是使用STDIN,

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

    as remembered here

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

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

    通常,这对主目录或其中的目录的权限是不可能或不允许的 . 这跟PostgreSQL没什么关系;你会发现:

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

    产生相同的错误 .

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

相关问题