Пишите в 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
в определении функции, если вы хотите избежать утечек в системе безопасности.