Я прошел через многочисленные другие сообщений (чтобы назвать только несколько), но все еще застрял.Конфигурация достаточно проста, и я подробно опишу все, хотя я думаю, что только некоторые из следующих уместны:
Запуск psql
от имени пользователя postgres в Ubuntu 16.04, у меня естьсозданная база данных qedadmin с 3 таблицами: сети , устройства и настройки ;есть также отношение последовательности networks_networkid_seq , принадлежащее networks.networkId .
Я пишу скрипт на python для запуска на том же сервере с использованием psycopg2, который должен выполнить SELECT
в таблице settings .Во многих примерах сценарии подключаются как пользователь ' postgres ', и это действительно отлично работает для меня.Однако я полагаю, что для такого рода вещей лучше использовать менее привилегированного пользователя, поэтому я создал пользователя qedserver с паролем.
Используя этого нового пользователя, пароль и localhost вСтрока подключения psycopg2, я могу успешно получить соединение и курсор (и если я использую неправильные значения пользователя или пароля, соединение не будет установлено, поэтому я знаю, что определенный пользователь и пароль, а также аутентификация от python работают).Тем не менее, все мои попытки выполнить оператор SELECT
для таблицы settings возвращают код 42501: в настройках отношений отказано в разрешении.
Я изначально предоставил пользователю qedserver только SELECT
привилегии и только для таблицы настройки :
GRANT SELECT ON settings TO qedserver;
Поскольку это не сработало, я постепенно повысил привилегии до такой степени, что теперь пользователь qedserver имеет ВСЕ ПРИВИЛЕГИИ на все 3 таблицы, на отношении последовательности и в базе данных:
GRANT ALL PRIVILEGES ON settings TO qedserver;
GRANT ALL PRIVILEGES ON devices TO qedserver;
GRANT ALL PRIVILEGES ON networks TO qedserver;
GRANT ALL PRIVILEGES ON networks_networkid_seq TO qedserver;
GRANT ALL PRIVILEGES ON DATABASE qedadmin TO qedserver;
, но я все еще получаю «разрешение на доступ к настройкам отношения».
ясно, изменение только строки подключения в моем скрипте Python с одного для пользователя postgres на одно для пользователя qedserver делает разницу между успехом и неудачей, поэтому я не предоставляю код Python, потому что ядумаю, что это не имеет значения (но я могу сделать это, если вы думаете, что это поможет).
Чего мне не хватает?
Отредактировано для добавления: нет пользователя linux с именем qedserver ;Я не думаю, что это должно быть, но, возможно, я ошибаюсь по этому поводу?(дальнейшее редактирование: я только что провел этот эксперимент, и это не имело никакого значения.)
Обновления: За комментарий и ссылку @klin, я вижу, что все привилегии были успешно предоставлены:qedserver имеет привилегии arwdDxt
в сетях , устройствах и настройках таблиц и rwU
привилегиях в networks_networkid_seq последовательности;и \l
сообщает о привилегиях доступа к базе данных qedadmin =Tc/postgres + postgres=CTc/postgres + qedserver=CTc/postgres
.
Я также отредактировал файл конфигурации (/etc/postgresql/10/main/postgresql.conf на моемsystem), чтобы установить log_error_verbosity = VERBOSE и отправить SIGHUP процессу postgresql, чтобы перечитать файл конфигурации.Это добавляло другую строку в журнал ошибок (/var/log/postgresql/postgresql-10-main.log в моей системе) для каждой неудачной попытки;теперь журнал показывает (новая строка - средняя):
qedserver@qedadmin ERROR: 42501: permission denied for relation settings
qedserver@qedadmin LOCATION: aclcheck_error, aclchk.c:3410
qedserver@qedadmin STATEMENT: SELECT * FROM settings WHERE deviceId = 10020;
Что еще я могу посмотреть или попытаться добиться прогресса?
Редактирование через 4 месяца, чтобы добавить: это все для нового проекта, для которого я думал, что было бы выгодно использовать postgresql по нескольким причинам;столкнувшись с этой проблемой на раннем этапе разработки и будучи не в состоянии решить ее в течение нескольких дней, я сдался и вместо этого выбрал mysql.Не совсем «решение» ОП, поэтому я не добавляю его в качестве ответа ...