Как мне изменить эффективного пользователя PSQL? - PullRequest
3 голосов
/ 06 мая 2010

Я использую psql для запуска простого набора операторов COPY, содержащихся в файле:

psql -d mydb -f 'wbf_queries.data.sql'

где wbf_queries.data.sql содержит строки:

copy <my_query> to '/home/gvkv/mydata' delimiter ',' null '';
...

но я получаю ошибку об отказе в разрешении:

... ERROR: could not open file ... for writing: Permission denied

Я подключаюсь под своей учетной записью (gvkv), которая также является суперпользователем в PostgreSQL. Очевидно, что psql работает под другим (эффективным) пользователем, но я не знаю, как это изменить. Это можно сделать в psql или мне нужен какой-нибудь unix-fu?


ОБНОВЛЕНИЕ: Согласно ответу Аракнида, вот соответствующая информация для всех, кто приходит:

\copy ...

Выполняет внешнюю (клиентскую) копию. Это операция, которая запускает команду SQL COPY, но вместо того, чтобы сервер считывал или записывал указанный файл, psql считывает или записывает файл и направляет данные между сервером и локальной файловой системой. Это означает, что доступ к файлу и права доступа принадлежат локальному пользователю , а не серверу, и привилегии суперпользователя SQL не требуются.

Подробнее здесь .

1 Ответ

4 голосов
/ 06 мая 2010

Вы не можете изменить действующего пользователя серверного процесса - только root может изменять идентификаторы пользователей UNIX по желанию. (Для пояснения: если вы скажете copy to '/home/gvkv/mydata', процесс postgres сервера попытается записать этот файл (который работает как postgres / pgdba / что угодно), а не ваш клиент psql (который работает как вы)).

Однако вы можете заставить сервер передавать данные клиенту, а затем сделать так, чтобы клиент записал их, используя вместо этого команду \ copy на стороне клиента, т. Е .:

\copy <copy-source> to '/home/gvkv/mydata' delimiter ',' null ''

psql преобразует это в команду «COPY TO STDOUT», а затем пишет /home/gvkv/mydata. Это безопасно передает данные через домены безопасности, хотя, конечно, это немного дороже.

...