У дозволі відмовлено у відносинах


329

Я спробував запустити просту команду 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"

Чи маєте ви якесь уявлення, що може бути не так?


Я не впевнений, як оновити дозволи, щоб я міг читати / писати в БД
Бобан

1
Вам потрібно надати необхідні привілеї: postgresql.org/docs/current/static/ddl-priv.html та postgresql.org/docs/current/static/sql-grant.html
a_horse_with_no_name

2
Ласкаво просимо до SO! З цим питанням ви можете отримати додаткову допомогу на сайті dba.stackexchange.com, хоча ви можете знайти стільки ж коментарів про сніг :)
Джаред Бек,

10
Вибачте. Це друге дуже важливе для програмування postgresql питання, яке я сьогодні бачив закритим як поза темою сьогодні! Останній мав 67 000 переглядів, цей - 30 000 переглядів. У нас має бути застереження про популярність: будь-яке не суб'єктивне запитання з> 15 000 переглядів = на тему.
Теодор Р. Сміт

1
Це питання не поза темою! Це, однак, дублювання stackoverflow.com/questions/13497352 / ...
Wheaties

Відповіді:


391

ГРАНТ в базі даних - це не те, що потрібно. Надайте на столи безпосередньо.

Надання привілеїв у базі даних в основному використовується для надання або скасування привілеїв підключення. Це дозволяє вказати, хто може робити речі в базі даних, якщо вони мають достатньо інших дозволів.

Ви хочете замість цього:

 GRANT ALL PRIVILEGES ON TABLE side_adzone TO jerry;

Це подбає про це питання.


7
запустити його як суперрусер, як постгреси.
Кріс Траверс

19
Чи може це бути ярликом якось? НАДАТИ ВСІ ПРИВІЛЕГИ НА ВСІ ТАБЛИЦІ?
Шадур

196
@Shadur НАДАЄ ВСІ ПРИВІЛЕГИ НА ВСІ ТАБЛИЦІ В СХЕМІ громадськості ДЖЕРІ;
Ron E

10
@RonE це обмежено для поточної бази даних?
Шадур

7
@zmiftah для схеми вам потрібно> НАДАЙТЕ ВСІ ПРИВІЛЕГИ НА СХЕМУ nameSchema TO користувачеві;
П'єрозі

241

Розміщення відповіді Рона Е для отримання пільг на надання грантів на всіх таблицях, оскільки це може бути корисним для інших.

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;

4
завдяки підключенню до правої бази даних НЕ я робив раніше!
асг

15
підключення до правої бази даних робить ВЕЛИЧЕЗНУ різницю :)\connect databasename;
Денис Матафонов

3
ЦЕЙ. Мене весь час підключали до "постгресів". Дякую тобі!
Андрій Г.

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;

це неприємність врятувало мені день!
анхран

19

Перший і важливий крок - підключення до вашого db:

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 для отримання більш детальної інформації та сценарію багаторазового використання.

Довідка:

ГРАНТ

АЛЬТЕ ЗАБЕЗПЕЧНІ ПРИВИЛЕГИ


9

Це часто трапляється, коли ви створюєте таблицю як поштові повідомлення користувача, а потім намагаєтесь отримати доступ до неї як звичайний користувач. У цьому випадку найкраще увійти як користувач 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. встановіть усі необхідні прапорці (або натисніть кнопку Надати всі)
  10. натисніть Зберегти

-3

Я колись стикався з цією проблемою. просто змініть користувача бази даних на суперпользователя і ваша проблема буде вирішена.

ПІСЛЯ ПОТРІБНОГО МЮЗИКА З СУПЕРУСЕРОМ;


Роблячи це, ви надаєте більше припущень, ніж вам потрібно. Superuser надасть їм дозвіл на інші операції, які ви, можливо, не захочете, щоб такі користувачі, як створення інших користувачів, бази даних тощо
Santi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.