В разрешении отказано для связи

331

Я попытался запустить простую команду sql:

select * from site_adzone;

и я получил эту ошибку

ERROR:  permission denied for relation site_adzone

В чем может быть проблема здесь?

Я попытался также сделать выбор для других таблиц и получил ту же проблему. Я также попытался сделать это:

GRANT ALL PRIVILEGES ON DATABASE jerry to tom;

но я получил этот ответ из консоли

WARNING:  no privileges were granted for "jerry"

У вас есть идея, что может быть не так?

Boban
источник
Я не уверен, как обновить разрешения, чтобы я мог читать / писать в БД
Бобан
1
Вам необходимо предоставить необходимые привилегии: postgresql.org/docs/current/static/ddl-priv.html и postgresql.org/docs/current/static/sql-grant.html
a_horse_with_no_name
2
Добро пожаловать на ТАК! На этот вопрос вы можете получить больше помощи на dba.stackexchange.com, хотя вы можете найти столько же безумных комментариев :)
Джаред Бек,
10
Прошу прощения. Это второй очень связанный с программированием вопрос postgresql, который я сегодня закрыл как не по теме! У последнего было 67 000 просмотров, это 30 000 просмотров. У нас должно быть предложение о популярности: любой несубъективный вопрос с> 15 000 просмотров = по теме.
Теодор Р. Смит
1
Этот вопрос не по теме! Это, однако, дублирование stackoverflow.com/questions/13497352/…
Wheaties

Ответы:

391

GRANT в базе данных не то, что вам нужно. Грант на столы напрямую.

Предоставление привилегий в базе данных в основном используется для предоставления или отзыва привилегий подключения. Это позволяет вам указать, кто может что-то делать в базе данных, если у них достаточно других разрешений.

Вы хотите вместо этого:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Это позаботится об этой проблеме.

Крис Траверс
источник
7
запустить его как суперпользователь, как postgres.
Крис Траверс
19
Может ли это быть как-то ярлык? ПРЕДОСТАВЛЯТЬ ВСЕ ПРИВИЛЕГИИ НА ВСЕХ СТОЛАХ?
Шадур
196
@Shadur ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА ВСЕ СТОЛЫ В СХЕМЕ общественности Джерри;
Рон И
10
@RonE, это ограничено текущей базой данных?
Шадур
7
@zmiftah для нужной вам схемы> ПРЕДОСТАВИТЕ ВСЕ ПРИВИЛЕГИИ НА СХЕМЕ nameSchema TO пользователю;
Pierozi
241

Размещение ответа Ron E для предоставления привилегий во всех таблицах, поскольку это может быть полезно для других.

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
провисать
источник
21
Вам также может понадобиться выполнить аналогичную команду для ALL SEQUENCESи ALL FUNCTIONS.
Пистос
7
Просто для тех, кому было интересно: ALL TABLESтакже включены представления, поэтому нет отдельной ALL VIEWSкоманды :-)
Андре Гассер
74

Сначала подключитесь к нужной базе данных , затем запустите:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO jerry;
user2757813
источник
4
спасибо подключение к нужной базе данных было НЕ я делал раньше!
просит
15
подключение к нужной базе данных делает ОГРОМНУЮ дуффенсию :)\connect databasename;
Денис Матафонов
3
ЭТОТ. Я был связан с "Postgres" все время. Спасибо!
Эндрю Г.
2
Да, подключение к БД имело значение
иностия
44
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public to jerry;
GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA public to jerry;
Klanjabrik
источник
этот ответ спас мой день!
anhtran
19

1-й и важный шаг - подключитесь к вашей БД:

psql -d yourDBName

2 шаг, предоставить привилегии

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO userName;
Зонда
источник
18

Чтобы предоставить разрешения всем существующим таблицам в схеме, используйте:

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA <schema> TO <role>

Чтобы указать разрешения по умолчанию, которые будут применяться к будущим таблицам, используйте:

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> 
  GRANT <privileges> ON TABLES TO <role>;

например

ALTER DEFAULT PRIVILEGES IN SCHEMA public 
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO admin;

Если вы используете SERIALили BIGSERIALстолбцы, то вы, вероятно, захотите сделать то же самое SEQUENCES, иначе ваш INSERTсбой ( Postgres 10IDENTITY не страдает от этой проблемы, и рекомендуется для SERIALтипов), т.е.

ALTER DEFAULT PRIVILEGES IN SCHEMA <schema> GRANT ALL ON SEQUENCES TO <role>;

См. Также мой ответ на PostgreSQL Permissions for Web App для получения более подробной информации и сценария для повторного использования.

Ref:

ГРАНТ

ALTER DEFAULT PRIVILEGES

isapir
источник
9

Это часто происходит, когда вы создаете таблицу как пользователь postgres, а затем пытаетесь получить к ней доступ как обычный пользователь. В этом случае лучше всего войти в систему как пользователь postgres и изменить владельца таблицы с помощью команды:

alter table <TABLE> owner to <USER>;
Брюс
источник
5

Убедитесь, что вы вошли в psql как владелец таблиц. выяснить, кому принадлежат таблицы\dt

psql -h CONNECTION_STRING DBNAME -U OWNER_OF_THE_TABLES

тогда вы можете запустить гранты

Брайан Макколл
источник
0

Поскольку вы ищете разрешения для выбора, я бы посоветовал вам предоставить только права выбора, а не все. Вы можете сделать это:

GRANT SELECT ON <table> TO <role>;
Сержи Рамон
источник
0

Вам следует:

  1. подключиться к базе данных с помощью DBeaver с пользователем postgres
  2. на левой вкладке откройте свою базу данных
  3. открыть вкладку Роли / выпадающий
  4. выберите своего пользователя
  5. на правой вкладке нажмите «Вкладка разрешений»
  6. нажмите на вкладку схемы
  7. нажмите вкладку таблицы / выпадающий
  8. выбрать все таблицы
  9. установите флажки для всех необходимых разрешений (или нажмите Grant All)
  10. нажмите Сохранить
happydmitry
источник
-3

Я сталкивался с этой проблемой однажды. просто измените пользователя базы данных на суперпользователя, и ваша проблема решена.

ALTER USER myuser С SUPERUSER;

Адебайо Огунмориеле
источник
Делая это, вы предоставляете больше прав, чем вам нужно. Superuser предоставит им разрешение на другие операции, которые вы, возможно, не захотите выполнять этому пользователю, такие как создание других пользователей, баз данных и т. Д.
Santi