1

我想遍历 PostgreSQL 数据库中的表,并使用变量kommunekode作为参数并将其打印到 CSV。但是,我无法让副本正常工作。我不是数据库的超级用户。

我可以使用 获取输出中的RAISE NOTICE变量,因此该变量可以正常工作。

当前代码:

DO $$
DECLARE
kommunekode text;
BEGIN
FOR loop_counter IN 1..99 LOOP
SELECT komkode into kommunekode FROM (SELECT komkode, ROW_NUMBER () OVER (ORDER BY komkode) FROM (SELECT DISTINCT komkode FROM kommunekoder) komkode) as x where row_number = loop_counter;
/COPY (Select * From bbr.co40100t_geo where komkode = kommunekode) TO 'C:\Path.csv with csv delimiter ';
END LOOP;
end; $$

当前错误:

ERROR:  cannot COPY to/from client in PL/pgSQL
CONTEXT:  PL/pgSQL function inline_code_block line 7 at SQL statement
4

1 回答 1

0

首先,\copy是一个psql命令,而不是 PL/pgSQL 或 SQL 命令。你必须使用COPY.

其次,如果您的意图是写入客户端计算机上的文件,则不能在函数中执行此操作。在数据库服务器上运行的代码应该如何访问客户端机器上的文件?

如果您的意图是在没有超级用户权限的情况下写入数据库服务器上的文件,有两种方法:

  • 如果您使用 PostgresSQL v11 或更高版本,请授予数据库用户该pg_write_server_files角色。

  • 将代码放在超级用户拥有并使用SECURITY DEFINER. 然后它将以超级用户权限运行,无论谁调用它。但是,如果您想避免安全漏洞,请不要在函数定义中使用也不要这样做。SET search_path = pg_catalog

于 2019-01-09T16:26:33.240 回答