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

Я хочу создать пользователя с только привилегии Select для всех таблиц во всех базах данных. Я думал, что смогу получить список баз данных и применить следующую команду для каждой базы данных:

GRANT select ON DATABASE dbname to user1;

но я получил следующую ошибку:

ERROR:  invalid privilege type SELECT for database

когда я гуглил, люди советовали делать grant select операцию для всех таблиц. Но новые таблицы добавляются всегда. Так что для меня это неприемлемое решение. Кто-нибудь знает обходные пути?

4 ответов


вы не можете сделать это на уровне базы данных, только на уровне схемы.

предполагая, что вы используете только public схемы в каждой базе данных, вы можете сделать это:

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;

вам нужно сделать 2 вещи: во-первых, обеспечить доступ к существующим объектам; и во-вторых, установить доступ по умолчанию для новых объектов, создаваемых с этого момента.

обратите внимание, что предоставление доступа к " таблицам "включает представления, но не включает последовательности (например, функцию автоматического приращения для" последовательных " столбцов), поэтому вы, вероятно, захотите предоставить доступ и к ним.

ниже предполагает, что вы хотите сделать все в public схемы. The ALTER DEFAULT PRIVILEGES заявление может подействовать на вся база данных, опустив IN SCHEMA ... пункта; в GRANT необходимо выполнить один раз для каждой схемы.

-- Grant access to current tables and views
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
-- Now make sure that's also available on new tables and views by default
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT
ON TABLES 
TO user1;

-- Now do the same for sequences
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT, USAGE
ON SEQUENCES 
TO user1;

руководство по PostgreSQL


Я понимаю, что вы уже сказали, что это неприемлемый ответ, но это правильный ответ в любом случае.

указание безопасности (предоставление и отзыв) является частью разработки и тестирования таблицы.

не перемещайте таблицы в производство до того, как определения таблиц, безопасность, тесты и тестовые данные находятся под контролем версий.

сказав это, PostgreSQL не имеет никаких разрешений SELECT на базы данных. Вы можете предоставить только разрешения CREATE, CONNECT или TEMP база данных.

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

синтаксис Гранта PostgreSQL


для версий Postgres ниже 9.0:

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;' 
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;' 
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' 
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME