Пишите в CSV в цикле PL/PgSQL, не будучи суперпользователем

Я хотел бы перебрать таблицу в базе данных 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

1 ответ

Первый, \copy это psql команда, а не команда PL/pgSQL или SQL. Вам придется использовать COPY,

Во-вторых, если вы хотите записать файл на клиентском компьютере, вы не можете сделать это в функции. Как должен код, работающий на сервере базы данных, обращаться к файлу на клиентском компьютере?

Если вы хотите записать файл на сервере базы данных без прав суперпользователя, есть два способа:

  • Если вы используете PostgresSQL v11 или выше, предоставьте пользователю базы данных pg_write_server_files роль.

  • Поместите код в функцию, которая принадлежит суперпользователю и определена с помощью SECURITY DEFINER, Затем он будет работать с привилегиями суперпользователя независимо от того, кто его вызывает. Но никогда не делайте этого без использования SET search_path = pg_catalog в определении функции, если вы хотите избежать утечек в системе безопасности.

Другие вопросы по тегам