windows - postgres COPY (...) TO PROGRAM on Windows 给出错误

标签 windows postgresql cmd psql pg-dump

我正在尝试使用 COPY 语句转储 PostgreSQL 表。我正在使用 COPY 而不是 pg_dump,因为我需要在其中一列出现时对其执行转换。

我要执行的语句本质上是这样的

COPY ( SELECT 'punt' ) TO PROGRAM '7z a -si C:/Users/Public/Documents/punt';

但是我遇到了一般错误

ERROR: program "7z a -si C:/Users/Public/Documents/punt" failed
DETAIL: child process exited with exit code 1

我正在尝试通过类似于 the fourth example 的 7zip 传递 COPY 输出在 COPY 文档中,以便压缩输出,因为数据库大约为 130 GB,我理想情况下使用 SSD。以下命令工作正常:

COPY ( SELECT 'punt' ) TO 'C:/Users/Public/Documents/punt';

结果 COPY 1。我在 psql 提示符下执行了以下命令,它也有效,这让我对语法和权限相当有信心:

\! echo 'punt' | 7z a -si C:/Users/Public/Documents/punt

我是否缺少有关 cmd 管道或 7zip 可执行权限的信息?

编辑: Postgres 版本为 9.3.3

根据 Craig Ringer 的回答,将目录权限更改为 NETWORK SERVICE 后,我仍然遇到相同的错误。但是,这并没有解决问题,错误是相同的。即使在更改目标目录的权限以完全控制 Everyone 之后,我仍然遇到相同的错误。我还尝试更改 7zip 可执行文件和 7zip Program Files 目录的权限,但无济于事。

在实验中,我运行了以下命令,从等式中取出副本的输入:

COPY ( select '1' ) TO PROGRAM 'echo punt | 7z a -si C:/Users/Public/Documents/punt';

奇怪地得到了失败消息,但退出代码为 255,对于 7zip has the meaning “用户停止了进程”。我自己似乎找不到原因。

最佳答案

这将是一个权限问题。

默认情况下,PostgreSQL 服务器在 9.2 及更高版本中以 NETWORKSERVICE 运行,在 9.1 及以下版本中以用户身份运行 postgresCOPY 作为用户 PostgreSQL 运行服务器端,它自己运行。

这两者都不太可能有权写入 C:\Users\Public\Documents

您需要使用 Windows 安全属性对话框授予 PostgreSQL 服务用户在此处写入的权限,或者选择它可以写入的其他位置。

它与 \! 一起工作,因为 psql 以您的用户身份运行,有权在那里写入,并且 \! 作为运行 psql 的用户在客户端运行命令。

关于windows - postgres COPY (...) TO PROGRAM on Windows 给出错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22672686/

相关文章:

sql - 如何在 PostgreSQL 中生成一系列重复数字?

c++ - 做系统();命令的工作方式与批处理命令完全相同?

python 使用 win32api 设置控制台全屏(或最大窗口大小)

c++ - 为什么这个 C++ 程序在 Windows 上比在 Linux 上慢?

python-3.x - 为什么我不能在 python 3 for Windows 中使用 pip 安装 hashlib?

linux - 在 windows 10 上挂载 webdav SSL

windows - PE导出台面设计

PostgreSQL 层次关系函数

SQL:在条件中加入 OR

cURL - 执行命令并将 Json 结果保存到文件?