В разрешении отказано для отношения <таблица>

12

Я запустил следующий SQL в PSQL:

CREATE USER bspu LOGIN;

CREATE DATABASE bsp OWNER bspu;

GRANT ALL PRIVILEGES ON DATABASE bsp TO bspu;

\c bsp

CREATE TABLE users (
  id SERIAL PRIMARY KEY,
  client_id VARCHAR(20) NOT NULL,
  api_key VARCHAR(100) NOT NULL,
  api_secret VARCHAR(100) NOT NULL,
  auth_token VARCHAR(128) NOT NULL
);

Когда я вхожу в систему bspuи пытаюсь запросить usersтаблицу, я получаю сообщение об ошибке:

permission denied for relation users

Я попытался запустить:

ALTER DEFAULT PRIVILEGES GRANT ALL ON TABLES TO bspu;

Но это не помогает. Что я делаю неправильно? Почему владелец базы данных НЕ имеет разрешения запрашивать собственную базу данных?

РЕДАКТИРОВАТЬ: Я обновился bspuдо суперпользователя, чтобы я мог продолжить работу. Любое дальнейшее руководство приветствуется.

если __name__ Нет
источник
Что \dt "users"показывает выход шоу?
BMA
@bma указан только мой основной акк.
если __name__ отсутствует None
Вы запускали начальные команды от имени какого пользователя? Что вы получаете SELECT session_user, current_userв верхней части вашего сценария? А какая у тебя версия Postgres?
Эрвин Брандштеттер
Если это были именно те команды, которые вы выполняли, то вы все еще связаны с вашим «основным акк». Итак, все сводится к тому, какие привилегии у вас есть. В противном случае, посмотрите отличный ответ Эрвина. (Позвольте мне признать, что мне кажется глупым, что это сообщение об ошибке не говорит о том, какая роль не имеет разрешения. Например, когда кто-то запускает цепочку функций с помощью SECURITY DEFINER, он довольно быстро запутывается, кто есть кто.)
dezso

Ответы:

22

DEFAULT PRIVILEGESничего не изменить разрешения для существующих объектов. Они являются привилегиями по умолчанию для вновь создаваемых объектов и только для конкретной роли, к которой они принадлежат. Если вы не определили роль при запуске ALTER DEFAULT PRIVILEGES, по умолчанию используется текущая роль (при выполнении ALTER DEFAULT PRIVILEGESоператора.

Кроме того, так как вы используете serialстолбец, который создает SEQUENCE, вы захотите установить привилегии по умолчанию для последовательностей.

Запустите это для пользователя, с которым вы создаете объекты, перед тем как запустить CREATEкоманду:

ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON TABLES TO bspu;
ALTER DEFAULT PRIVILEGES [ FOR ROLE my_create_role] GRANT ALL ON SEQUENCES TO bspu;

Если вы должны использовать pgAdmin, предостережение. В текущей версии 1.20 (или более ранней) есть ошибка в отображении обратного сценария SQL для DEFAULT PRIVILEGES. Дисплей игнорирует пользователя-владельца и поэтому некорректен в определенных ситуациях. Я сообщил об ошибке, дело находится на рассмотрении .

Для существующих объектов вас также может заинтересовать эта «пакетная» форма GRANTкоманды :

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO bspu;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO bspu;

Больше под этим связанным вопросом на SO:

Эрвин Брандштеттер
источник
1
Упомянутая ошибка все еще сохраняется в pgAdmin4, см. Redmine.postgresql.org/issues/4685 , который помечен как дубликат redmine.postgresql.org/issues/4256
dpprdan
-1
This is working for me after some research. psql (9.6.12)

-- login to postgres database server as postgres user.
ssh <user>>@hostname.<domain>>.com
sudo su postgres
id
psql
postgres=# create user sentry_read with login password 'sentry_read';
postgres=# du+
postgres=# \l+
-- **very important: make sure we should connect required database before we grant to user.**
postgres=# \c sentry
postgres=# \dt
sentry=# \dp SENTRY_VERSION
sentry=# select * from "SENTRY_VERSION";
sentry=# GRANT SELECT ON ALL TABLES IN SCHEMA public TO sentry_read;
postgres=# \q

[user@hostname ~]$ psql -U sentry_read -d sentry -h hostname.<domain>>.com -W
sentry=> select * from "SENTRY_VERSION";
Срину Марети
источник