在 Ubuntu 上将 CSV 导入 Postgres 时 \copy 权限被拒绝

Man*_*iri 6 csv postgresql ubuntu-14.04

我在 Ubuntu 14.04 上使用 Postgres,并且一直在尝试将 csv 文件导入到 Postgres 中名为“天气”的表中。我查看了问题Postgres ERROR: Could not open file for read: Permission returned 并尝试使用该\copy命令而不是常规副本,但我仍然遇到相同的Permission Denied错误。

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

\copy weather from '/home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv' HEADER DELIMITER ',' CSV
Run Code Online (Sandbox Code Playgroud)

这是终端的屏幕截图:

在此输入图像描述

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

Pet*_*uss 5

未经许可通过终端替代

NOTES 的 pg文档 说

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

因此,一般来说,使用psql任何客户端,即使在本地服务器中,也会遇到问题......而且,如果您为其他用户表达 COPY 命令,例如。在 Github README 中,读者会遇到问题......

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

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

正如这里所记得的

psql -h remotehost -d remote_mydb -U myuser -c \
   "copy mytable from STDIN with delimiter as ','" \
   < ./relative_path/file.csv
Run Code Online (Sandbox Code Playgroud)


use*_*213 4

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

您始终可以制作该文件的副本,将该文件的权限分配给 Postgres 可以执行的目录中的用户 Postgres,然后删除该文件,或者您可以这样做:

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

namei -l /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
Run Code Online (Sandbox Code Playgroud)

sudo apt-get install util-linux(如果尚未安装,您可能需要在运行此命令之前进行)

该命令将列出文件及其所有父目录的当前权限,以便我们找到解决方案。

假设所有目录都有以“x”结尾的条目,如下所示:

drwxr-xr-x user group filename
drwxr-xr-x
drwxr-xr-x
-rw-------
Run Code Online (Sandbox Code Playgroud)

那么下面的两个解决方案中的任何一个都可以工作。

  1. 如果您不想更改所有用户的权限并且您拥有 sudoer 权限,您可以这样做

    sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv postgresql
    
    Run Code Online (Sandbox Code Playgroud)

    但是,这种方法将撤销您对该文件的访问权限,这可能是您不想要的。但在完成导入后,您始终可以将文件 chown 返回给您

    sudo chown /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv user1
    
    Run Code Online (Sandbox Code Playgroud)
  2. 如果您不介意所有用户都读取您的文件,那么您可以执行(作为 user1 并且没有 root 权限)

    chmod a+r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
    
    Run Code Online (Sandbox Code Playgroud)

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

    当然,一旦您阅读了该文件,您随时可以再次限制权限

    chmod a-r /home/user1/Dropbox/Development/Databases/SQL/Codeschool/TrySQL/temp_data.csv
    
    Run Code Online (Sandbox Code Playgroud)

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