Postgresql \在Ubuntu上将CSV导入Postgres时,复制权限被拒绝
我在Ubuntu 14.04上使用Postgres,我一直在尝试将一个csv文件导入Postgres中一个名为“weather”的表中。我已经查看了这个问题,并尝试使用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
\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-------
那么下面两个解决方案中的任何一个都会起作用
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
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