postgres - 将输出保存到服务器硬盘

时间:2015-01-16 23:15:33

标签: postgresql copy

当我执行以下脚本时:

copy (
select agk_p_id Promoter_agk, multiplication_lr_agk_p_k4, agk_lr_rvd, status_agk_p_k4
from patient_agk_p_expr
where  status_agk_p_k4='Preferentially') 
to 'g:\boom.csv' 
With CSV HEADER;

它工作得很漂亮,并在我的驱动器上创建boom.csv文件。 我明白了:

Query returned successfully: 8486 rows affected, 631 ms execution time.

我应该注意到我的' drive是连接到我的计算机的外部硬盘。 我的cygwin指的是我的硬盘驱动器:

blumr04@SRB524YBZ1 /cygdrive/g/
$ pwd
/cygdrive/g

现在,我的计算机还可以访问我的组织的服务器硬盘。 在我的Windows资源管理器中,它指的是(Z:)

我的cygwin指的是' Z'相应的驱动(就像它对我的C:驱动器一样):

blumr04@SRB524YBZ1 /cygdrive/z/
$ pwd
/cygdrive/z

但是当我遇到postgres识别这个硬盘时我遇到了麻烦 - 当我尝试运行以下脚本以便将我的表保存到Z硬盘时:

copy (
select agk_p_id Promoter_agk, multiplication_lr_agk_p_k4, agk_lr_rvd, status_agk_p_k4
from patient_agk_p_expr
where  status_agk_p_k4='Preferentially') 
to 'z:\boom.csv' 
With CSV HEADER;

我收到以下错误消息:

ERROR:  could not open file "z:\boom.csv" for writing: No such file or directory
********** Error **********

ERROR: could not open file "z:\boom.csv" for writing: No such file or directory
SQL state: 58P01

有人知道如何保存(复制到)我的文件,当涉及到没有物理连接到我的计算机的硬盘驱动器,而是服务器硬盘驱动器? - postgres中是否有一个命令/脚本能够显示postgres可以访问哪些硬盘?看起来由于某种原因,Z硬盘驱动器不能用于postgres读/写,至少不是我尝试它的方式,而G,J,K和其他硬盘驱动器是外部HD - 是可访问的。我很高兴知道我是否可以以某种方式扩展postgres可访问性..

谢谢!

@Mike Sherrill' Cat Recall'

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

我的Z驱动器在Windows资源管理器中也称为: (\ shares.nyumc.org \研究)(Z :), 因此我也尝试了以下内容:

copy (
select agk_p_id Promoter_agk, multiplication_lr_agk_p_k4, agk_lr_rvd, status_agk_p_k4
from patient_agk_p_expr
where  status_agk_p_k4='Preferentially') 
to '\\shares.nyumc.org\research\boom.csv' 
With CSV HEADER;

这个脚本给了我以下错误,实际上所有关于权限的错误:

ERROR:  could not open file "\\shares.nyumc.org\research\boom.csv" for writing: Permission denied
********** Error **********

ERROR: could not open file "\\shares.nyumc.org\research\boom.csv" for writing: Permission denied
SQL state: 42501

所以看起来正确的道路是:

\\shares.nyumc.org\research\

在这种情况下(Z :)只是一个别名(?!),因为错误消息不是关于"没有这样的文件或目录",而是关于权限。

  • 有没有办法可以为Postgres提供必要的权限,以便它可以写入服务器驱动器?

1 个答案:

答案 0 :(得分:1)

运行COPY tablename to filename的最常见问题是从PostgreSQL服务器的角度处理路径和权限。

  

COPY命令中命名的文件由。直接读取或写入   服务器,而不是客户端应用程序。因此,他们必须居住在   或者可以访问数据库服务器计算机,而不是客户端。他们   必须是PostgreSQL用户可以访问,可读或可写的   (服务器运行的用户ID),而不是客户端。 Source

如果您尝试写入PostgreSQL服务器无法查看的文件,那么您将获得"没有这样的文件或目录"。如果您尝试写入PostgreSQL服务器缺少权限的目录中的文件,您将获得"权限被拒绝"。

因此,PostgreSQL用户(服务器运行的用户ID)缺少对" z"的权限。