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

\copy permission denied while importing CSV to Postgres on Ubuntu

我在 Ubuntu 14.04 上使用 Postgres,我一直在尝试将 csv 文件导入 Postgres 中名为 'weather' 的 table。我查看了问题 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 解决方案只有在以下情况下才有效:you,而不是 postgres,是 运行s psql 命令的用户。

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

您需要更改的内容取决于此命令的输出 (运行 as 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. 如果你不想更改所有用户的权限并且你有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
    
  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
    

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

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

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

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

产生同样的错误。

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

没有权限的终端选择

pg documentation at NOTES

The path will be interpreted relative to the working directory of the server process (normally the cluster's data directory), not the client's working directory.

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

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

When STDIN or STDOUT is specified, data is transmitted via the connection between the client and the server.

作为:

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