我正在尝试使用 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

我试图通过类似于 COPY 文档中的 the fourth example 的 7zip 传递 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 的回答将 dir 权限更改为 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 及以下版本中作为用户 postgres 运行。 COPY 以用户 PostgreSQL 的身份运行服务器端。

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

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

它适用于 \! ,因为 psql 以您的用户身份运行,该用户将有权在那里写入,而 \! 以运行 psql 的用户身份在客户端运行命令。

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

10-15 18:17