22.5. Сценарий управления правами #
Рассмотрим сценарий, в котором они предоставляются по иерархии: от главного администратора локальным администраторам групп пользователей и аналитикам (обратитесь к диаграмме ниже).
Где:
Суперпользователь — это суперпользователь Postgres Pro с полным набором прав.
metastore_admin— это администратор Postgres Pro AXE.Администраторы A и B — это локальные администраторы групп пользователей, у которых есть доступ к объектам pgpro_metastore, связанным с этими группами.
Права администраторам A и B предоставляет администратор Postgres Pro AXE, и эти администраторы могут предоставлять права аналитикам в каждой группе.
Аналитики A, B, C и D — пользователи, которые работают с OLAP-данными.
Чтобы настроить этот сценарий управления правами:
Создайте пользователей Postgres Pro от имени суперпользователя.
Пример 22.7.
postgres=# SELECT current_user; current_user -------------- root postgres=# CREATE USER metastore_admin; postgres=# CREATE USER admin_a; postgres=# CREATE USER admin_b; postgres=# CREATE USER analyst_a; postgres=# CREATE USER analyst_b; postgres=# CREATE USER analyst_c; postgres=# CREATE USER analyst_d;
Создайте схемы для групп пользователей.
Пример 22.8.
postgres=# SELECT current_user; current_user -------------- root postgres=# CREATE SCHEMA schema_a; postgres=# CREATE SCHEMA schema_b;
Дальнейший сценарий будет основан на схеме
schema_a. Для схемыschema_bвыполняются такие же шаги.Предоставьте ролям
metastore_adminиadmin_aправа на схемуschema_a.Пример 22.9.
postgres=# SELECT current_user; current_user -------------- root postgres=# GRANT ALL ON SCHEMA schema_a to metastore_admin WITH GRANT OPTION; postgres=# GRANT ALL ON SCHEMA schema_a to admin_a WITH GRANT OPTION;
Предоставьте роли
metastore_adminправа на схемуmetastoreи назначьте её Postgres Pro AXE администратором:postgres=# SELECT current_user; current_user -------------- root postgres=# GRANT ALL ON SCHEMA metastore TO metastore_admin; postgres=# ALTER SYSTEM SET duckdb.postgres_role TO 'metastore_admin';
Теперь администратор Postgres Pro AXE может настроить каталог метаданных.
Пример 22.10.
postgres=> SELECT current_user;
current_user
-----------------
metastore_admin
postgres=> SELECT metastore.define_catalog_connection('localhost','5433','postgres', '', '');
postgres=> SELECT metastore.init();Если в схеме группы A есть таблица-куча и OLAP-данные из этой таблицы необходимо использовать для аналитических запросов в Postgres Pro AXE:
Администратор Postgres Pro AXE создаёт хранилище и аналитическую таблицу.
Пример 22.11.
postgres=> SELECT current_user; current_user ----------------- metastore_admin postgres=> SELECT metastore.add_storage('mt_storage', 'file:///tmp/mt_storage/', 'file:///tmp/mt_storage/tmp_dir/'); postgres=> SELECT metastore.add_table('mt_table1', 'mt_storage', 'schema_a.pg_table');Администратор Postgres Pro AXE предоставляет роли
admin_aправо на аналитическую таблицу.Пример 22.12.
postgres=> SELECT current_user; current_user ----------------- metastore_admin postgres=# SELECT metastore.mgrant('ALL','TABLE','mt_table1','admin_a', TRUE);Роль
admin_aтеперь может скопировать OLAP-данные из таблицы-кучи в аналитическую таблицу и создать представление Postgres Pro для этой таблицы.Пример 22.13.
postgres=> SELECT current_user; current_user -------------- admin_a postgres=> SELECT metastore.copy_table('mt_table1', 'select * from schema_a.pg_table'); postgres=> SELECT metastore.create_view('mt_table1', 'schema_a');Как владелец аналитической таблицы, администратор Postgres Pro AXE должен разрешить роли
admin_aпредоставлять право другим ролям.Пример 22.14.
postgres=> SELECT current_user; current_user ----------------- metastore_admin postgres=> GRANT SELECT ON schema_a.mt_table1 TO admin_a WITH GRANT OPTION;Теперь роль
admin_aможет предоставлять право другим ролям:Пример 22.15.
postgres=> SELECT current_user; current_user -------------- admin_a (1 row) postgres=> GRANT USAGE ON SCHEMA schema_a to analyst_a; postgres=> GRANT SELECT ON schema_a.mt_table1 TO analyst_a;
В итоге роль
analyst_aможет выполнять командуSELECTнад аналитической таблицей.postgres=> SELECT current_user; current_user -------------- analyst_a (1 row) postgres=> SELECT COUNT(*) FROM schema_a.mt_table1; count ------- 50 (1 row)