Подтвердить что ты не робот

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

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

GRANT select ON DATABASE dbname to user1;

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

ERROR:  invalid privilege type SELECT for database

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Обратите внимание, что предоставление доступа к "ТАБЛИЦАМ" включает представления, но не включает в себя последовательности (такие как функция автоматического увеличения для столбцов "SERIAL" ), поэтому вы, вероятно, захотите также предоставить доступ к этим.

Ниже предполагается, что вы хотите сделать все в схеме public. Оператор 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 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

Ответ 3

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

Указание безопасности (GRANT и REVOKE) является частью проектирования и тестирования таблиц.

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

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

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

Синтаксис синтаксиса PostgreSQL

Ответ 4

Для версий 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