Дозвіл відмовлено у відношенні <table>


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;

Але це не допомагає. Що я роблю неправильно? Чому власник бази даних НЕ має дозволів запитувати власну базу даних?

EDIT: bspuНаразі я перейшов до суперпопулярного, щоб продовжувати роботу. Будь-яке подальше керівництво оцінено.


Що показує вихід \dt "users"?
bma

@bma в списку лише мій головний аккаунт.
якщо __name__ не вказано

Ви використовували початкові команди, як користувач? Що ви отримуєте SELECT session_user, current_userвгорі свого сценарію? А яка ваша версія Postgres?
Ервін Брандстеттер

Якщо це були точні команди, які ви виконуєте, то ви все ще пов'язані зі своїм головним обліковим записом. Тож зводиться до того, які у вас є пільги . Інакше див. Відмінну відповідь Ервіна. (Дозвольте мені визнати, що я почуваю себе німим, що це повідомлення про помилку не вказує, яка роль не має дозволу. Наприклад, коли людина запускає ланцюг функцій із SECURITY DEFINER, він досить швидко заплутається, хто є хто.)
dezso

Відповіді:


22

DEFAULT PRIVILEGESнічого НЕ змінити дозволу для існуючих об'єктів. Вони є пільгами за замовчуванням для новостворених об'єктів і лише для певної ролі, якій вони належать. Якщо ви не визначаєте роль під час запуску ALTER DEFAULT PRIVILEGES, вона за замовчуванням застосовується до поточної ролі (під час виконання ALTER DEFAULT PRIVILEGESоператора.

Крім того, оскільки ви використовуєте serialстовпець, який створює a 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/isissue/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";
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.