2010-05-06 29 views
3

我使用PSQL运行包含在文件中一组简单的COPY语句:如何更改psql的有效用户?

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?


UPDATE:按照araqnid的答案,这里是为别人谁上台的有关信息:

\copy ... 

执行前端(客户端)拷贝。这是一个运行SQL COPY命令的操作,但不是读取或写入指定文件的服务器,而是读取或写入文件,并在服务器和本地文件系统之间路由数据。这意味着文件的可访问性和权限是本地用户的可访问性和权限,而不是服务器,并且不需要SQL超级用户权限。

更多here

回答

4

您无法更改服务器进程的有效用户 - 只有root用户可以随意更改UNIX用户标识。 (要说明:如果你说copy to '/home/gvkv/mydata',服务器postgres进程将尝试写入该文件(作为postgres/pgdba/whatever运行),而不是您的客户端psql(与您一样运行))。

你可以,但是,在服务器中的数据流式传输到客户端,然后在客户端写出来,通过使用客户端的\复制命令代替,即:

\copy <copy-source> to '/home/gvkv/mydata' delimiter ',' null '' 

psql将翻译这到“复制到标准输出”命令,然后写入/home/gvkv/mydata本身。这可以安全地跨安全域传输数据,但当然它会更贵一些。

+0

+1用于建立区别:有一点是客户端(psql进程,与服务器无关,它自己的unix用户,或许甚至是它自己的计算机),另一件事是服务器(postgres服务器进程 - 又名postmaster)。你必须问问自己哪个应该访问文件系统。 – leonbloy 2010-05-06 11:12:26