2017-02-06 11 views
0

У меня есть проект, в котором postgres db помещается в файл .sql на тестовом сервере ci. Это будет построено и опубликовано как изображение докера.Тестирование базы данных Postgres DB для правильных разрешений программно, после заполнения из .sql-файла

Теперь я не буду единственным, нажимая эти .sql-файлы на сервер. Поэтому мне нужно проверить разрешения всех пользователей postgres (и, возможно, будущих пользователей) на все базы данных, представленные этим файлом.

Пример: Пользователь A и B. Пользователь A является суперпользователем и владеет всеми базами данных. Пользователь B должен только читать быть в состоянии прочитать в базе данных X. и так далее

Есть ли способ, чтобы проверить это programmaticaly? Помимо «попытаться считать B с ошибкой Y ->?

Все остальные решения, которые я нашел до сих пор, являются либо вручную, либо «попытками/ошибками».

+3

[Доступ к функциям привилегий запрос] (https://www.postgresql.org/docs/current/static/functions-info.html#FUNCTIONS- INFO-ACCESS-TABLE) –

+0

Спасибо. Но: SELECT has_schema_privilege ('B', 'X', 'select'); Результаты: ОШИБКА: непризнанный тип привилегий: "select" Есть ли способ спросить «has_table_privilege» для выбора во всех таблицах в схеме «P»? Есть ли короткий путь, чтобы исключить все остальное? – MrOerni

ответ

0

Вы можете проверить гранты для объектов различных типов объектов через access privilege inquiry functions. Все они работают на уровне отдельных объектов, поэтому для любых проверок базы данных вам необходимо объединить их с запросами catalog. Вам также необходимо проконсультироваться с каталогом по любой информации о собственности. OID typesчрезвычайно полезно при написании этих запросов.

Чтобы проверить, если пользователь b имеет доступ только для чтения ко всем таблицам в схеме p:

SELECT EVERY(
    has_table_privilege('b', oid, 'SELECT') AND 
    NOT has_table_privilege('b', oid, 'INSERT,UPDATE,DELETE,TRUNCATE,REFERENCES,TRIGGER') 
) 
FROM pg_class 
WHERE relkind = 'r' 
    AND relnamespace = 'p'::regnamespace 

(Обратите внимание, что привилегии таблиц заменены грантами колонки уровня, так что вы можете проверить их тоже.)

Чтобы проверить a является суперпользователем:

SELECT rolsuper 
FROM pg_roles 
WHERE rolname = 'a' 

Чтобы проверить a владеет всеми базами данных (кроме тех, которые созданы initdb):

SELECT EVERY(datdba = 'a'::regrole) 
FROM pg_database 
WHERE datname NOT IN ('postgres', 'template0', 'template1')