Как создать пользователя с правами только на чтение для всех баз данных в 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, но это довольно легко проверить.
для версий 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