我正在使用psql运行文件中包含的一组简单的COPY语句:
psql -d mydb -f 'wbf_queries.data.sql'
其中wbf_queries.data.sql
包含行:
copy <my_query> to '/home/gvkv/mydata' delimiter ',' null '';
...
但是我得到了一个拒绝权限错误:
... ERROR: could not open file ... for writing: Permission denied
我在我的用户帐户(gvkv)下连接,这也是PostgreSQL中的超级用户。显然,psql在不同(有效)的用户下运行,但我不知道如何更改它。可以在psql中完成,还是需要一些unix-fu?
更新:根据araqnid的回答,这里是来自其他任何人的相关信息:
\copy ...
执行前端(客户端)副本。这是一个运行SQL COPY命令的操作,但不是服务器读取或写入指定的文件,psql读取或写入文件并在服务器和本地文件系统之间路由数据。这意味着文件可访问性和权限是本地用户的权限,而不是服务器,并且不需要SQL超级用户权限。
更多here。
答案 0 :(得分:4)
您无法更改服务器进程的有效用户 - 只有root可以随意更改UNIX用户ID。 (澄清一下:如果你说copy to '/home/gvkv/mydata'
,服务器postgres进程将尝试编写该文件(运行为postgres / pgdba / whatever),而不是你的客户端psql(以你的身份运行)。)
然而,您可以让服务器将数据流传输到客户端,然后让客户端使用客户端\ copy命令来编写它,即:。
\copy <copy-source> to '/home/gvkv/mydata' delimiter ',' null ''
psql会将此转换为“COPY TO STDOUT”命令,然后自己编写/home/gvkv/mydata
。这样可以安全地传输安全域中的数据,但当然它的价格要贵一些。