Не удается заставить работать доступ к существующим таблицам - PullRequest
0 голосов
/ 04 июня 2018

Я не могу добавить новую роль БД, которая будет иметь привилегию SELECT для таблиц из конкретной базы данных.

Моя проблема заключается в том, что роль не может SELECT из таблицыв существующей БД.

Вот мой неудачный тестовый сценарий (написанный таким образом, чтобы его можно было безопасно скопировать в /tmp/test.sh и выполнить):

# --- cleanup objects, if any
psql -U postgres -c "REVOKE SELECT ON ALL SEQUENCES IN SCHEMA public FROM db_reader"
psql -U postgres -c "REVOKE SELECT ON ALL TABLES IN SCHEMA public FROM db_reader"
psql -U postgres -c "REVOKE USAGE ON SCHEMA public FROM db_reader"
psql -U postgres -c "DROP ROLE IF EXISTS db_reader"
psql -U postgres -c "DROP DATABASE IF EXISTS some_existing_db"
# --- test
psql -U postgres -c "CREATE DATABASE some_existing_db"
psql -U postgres some_existing_db -c "CREATE TABLE cats (name varchar(10))"
psql -U postgres some_existing_db -c "INSERT INTO cats (name) VALUES ('a'), ('b')"
psql -U postgres -c "CREATE ROLE db_reader WITH login"
psql -U postgres -c 'GRANT SELECT ON ALL SEQUENCES IN SCHEMA public TO db_reader'
psql -U postgres -c 'GRANT SELECT ON ALL TABLES IN SCHEMA public TO db_reader'
psql -U postgres -c 'GRANT USAGE ON SCHEMA public TO db_reader'
psql -U db_reader some_existing_db -c "SELECT COUNT(1) FROM cats"

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

ERROR:  permission denied for relation cats

Почему?

1 Ответ

0 голосов
/ 04 июня 2018

Вам не хватает, что базы данных логически разделены.

Ваши операторы GRANT выполняются в базе данных postgres (если вы не укажете имя базы данных, psql попытается подключиться к базе данныхс тем же именем, что и у пользователя базы данных).

Следовательно, действие этих грантов ограничено базой данных, к которой вы подключены.

Вы должны добавить some_existing_db к psql вызовов, когда вы предоставляете привилегии db_reader.

...