PostgreSQL: пользователь только для чтения

У нас есть база данных PostgreSQL db1, содержащая около 500 схем. Я пытаюсь создать пользователя с правами только для чтения для этой конкретной базы данных PostgreSQL.

Я успешно назначил разрешение только на чтение для конкретной схемы, используя следующую команду

GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO readonly_user;

но

1) У нас около 500 схем, поэтому предоставить разрешение для каждой схемы сложно.

2) Эти схемы будут динамически создаваться или удаляться ежедневно, поэтому предоставление разрешения при каждом создании схемы также является сложной задачей.

Есть ли способ предоставить разрешение только на чтение для всей базы данных вместо схемы?

В MySQL я могу сделать это с помощью следующей команды

grant select on *.* to 'user_name'@'IP';

Ищу аналогичную команду в PostgreSQL.

Мы используем PostgreSQL 10.


person jithin giri    schedule 03.09.2019    source источник


Ответы (2)


Вы можете создавать запросы sql грантов, которые извлекают гранты и выполняют их.

select distinct 'GRANT SELECT on ALL TABLES IN SCHEMA '||schemaname||' to user;' from pg_tables where schemaname not in ('pg_catalog','information_schema');
person Lohit Gupta    schedule 03.09.2019
comment
Спасибо за ответ, Лохит, это решит мою первую проблему. Есть ли способ решить вторую проблему? 2) Эти схемы будут динамически создаваться или удаляться ежедневно, поэтому предоставление разрешения при каждом создании схемы также является сложной задачей. - person jithin giri; 03.09.2019
comment
Вы можете создать задание cron или задание базы данных, чтобы запланировать выполнение гранта ежедневно. - person Lohit Gupta; 09.09.2019

Один оператор DO может помочь:

DO
$$DECLARE
   v_schema name;
BEGIN
   FOR v_schema IN
      SELECT nspname FROM pg_namespace
      WHERE nspname NOT IN ('pg_catalog', 'information_schema', 'pg_toast')
        AND nspname NOT LIKE 'pg_temp%'
        AND nspname NOT LIKE 'pg_toast_temp%'
   LOOP
      EXECUTE format(
                 'GRANT SELECT ON ALL TABLES IN SCHEMA %I TO readonly_user',
                 v_schema
              );
   END LOOP;
END;$$;
person Laurenz Albe    schedule 03.09.2019