Предоставить использование / выбрать одну таблицу
Если вы предоставляете только CONNECT для базы данных, пользователь может подключиться, но не имеет других привилегий. Вы должны предоставить USAGE для пространств имен (схем) и SELECT для таблиц и представлений по отдельности следующим образом:
GRANT CONNECT ON DATABASE mydb TO xxx;
-- This assumes you're actually connected to mydb..
GRANT USAGE ON SCHEMA public TO xxx;
GRANT SELECT ON mytable TO xxx;
Несколько таблиц / представлений (PostgreSQL 9.0+)
В последних версиях PostgreSQL вы можете предоставлять разрешения для всех таблиц / представлений / и т. Д. В схеме, используя одну команду, вместо того, чтобы вводить их по одному:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO xxx;
Это влияет только на таблицы, которые уже были созданы. Более эффективно, вы можете автоматически назначать роли по умолчанию для новых объектов в будущем:
ALTER DEFAULT PRIVILEGES IN SCHEMA public
GRANT SELECT ON TABLES TO xxx;
Обратите внимание, что по умолчанию это повлияет только на объекты (таблицы), созданные пользователем, который выполнил эту команду: хотя она также может быть установлена для любой роли, членом которой является выдавший пользователь. Однако вы не выбираете привилегии по умолчанию для всех ролей, в которых вы участвуете, при создании новых объектов ... так что все еще есть некоторые недоработки. Если вы принимаете подход, согласно которому база данных играет роль-владелец, а изменения схемы выполняются в качестве этой роли-владельца, вам следует назначить привилегии по умолчанию для этой роли-владельца. ИМХО, все это немного сбивает с толку, и вам, возможно, придется поэкспериментировать, чтобы создать функциональный рабочий процесс.
Несколько таблиц / представлений (версии PostgreSQL до 9.0)
Чтобы избежать ошибок при длительных изменениях в нескольких таблицах, рекомендуется использовать следующий «автоматический» процесс для генерации требуемого GRANT SELECT
для каждой таблицы / представления:
SELECT 'GRANT SELECT ON ' || relname || ' TO xxx;'
FROM pg_class JOIN pg_namespace ON pg_namespace.oid = pg_class.relnamespace
WHERE nspname = 'public' AND relkind IN ('r', 'v', 'S');
Это должно вывести соответствующие команды GRANT в GRANT SELECT для всех открытых таблиц, представлений и последовательностей, для копирования-n-paste. Естественно, это будет применяться только к таблицам, которые уже были созданы.
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
. Без этого пользователь «только для чтения» не может изменять существующие таблицы, но может создавать новые таблицы в схеме и добавлять / удалять данные из этих таблиц.psql mydb
противном случае большинство этих манипуляций не будет. Лично мне потребовалось немало времени, чтобы понять это самостоятельно. Надеюсь, это кому-нибудь поможет.Обратите внимание, что PostgreSQL 9.0 (сегодня в бета-тестировании) будет иметь простой способ сделать это :
источник
Ссылка взята из этого блога:
Скрипт для создания пользователя только для чтения:
Назначьте разрешение этому пользователю только для чтения:
Назначьте разрешения на чтение всех вновь созданных таблиц в будущем
источник
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO Read_Only_User;
он также позволит читать все таблицы, созданные в одной и той же БД в будущем.INSERT
s.GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA schema_name TO Read_Only_User;
GRANT ALL ON ALL SEQUENCES IN SCHEMA schema_name TO Read_Only_User
?Вот лучший способ, который я нашел, чтобы добавить пользователей только для чтения (используя PostgreSQL 9.0 или новее):
Затем войдите на все связанные машины (master + read-slave (s) / hot-standby (s) и т. Д.) И запустите:
источник
По умолчанию новые пользователи будут иметь разрешение на создание таблиц. Если вы планируете создать пользователя только для чтения, это, вероятно, не то, что вы хотите.
Чтобы создать истинного пользователя только для чтения с PostgreSQL 9.0+, выполните следующие шаги:
Если ваш пользователь, доступный только для чтения, не имеет прав доступа к списку таблиц (т.е. не
\d
возвращает результатов), возможно, это связано с тем, что у вас нетUSAGE
прав доступа к схеме.USAGE
это разрешение, которое позволяет пользователям фактически использовать назначенные им разрешения. какой в этом смысл? Я не уверен. Исправить:источник
Я создал удобный сценарий для этого; pg_grant_read_to_db.sh . Этот сценарий предоставляет привилегии только для чтения указанной роли для всех таблиц, представлений и последовательностей в схеме базы данных и устанавливает их по умолчанию.
источник
Я прочитал все возможные решения, и все в порядке, если вы помните, чтобы подключиться к базе данных, прежде чем предоставить вещи;) В любом случае, спасибо всем остальным решениям !!!
создать пользователя PSQL:
запустите psql cli и установите пароль для созданного пользователя:
подключиться к целевой базе данных:
предоставить все необходимые привилегии:
изменить привилегии по умолчанию для целей db public shema:
источник
Если ваша база данных находится в публичной схеме, это легко (предполагается, что вы уже создали
readonlyuser
)Если ваша база данных использует
customschema
, выполните вышеописанное, но добавьте еще одну команду:источник
Непростой способ сделать это - предоставить select для каждой таблицы базы данных:
Вы можете автоматизировать это, генерируя ваши заявления о предоставлении грантов из метаданных базы данных.
источник
источник
Взятый по ссылке, размещенной в ответ на despesz ' ссылку .
Postgres 9.x, кажется, имеет возможность делать то, что запрашивается. См. Пункт «Предоставление объектов базы данных»:
http://www.postgresql.org/docs/current/interactive/sql-grant.html
Где написано: «Существует также возможность предоставления привилегий всем объектам одного типа в одной или нескольких схемах. В настоящее время эта функция поддерживается только для таблиц, последовательностей и функций (но учтите, что ВСЕ ТАБЛИЦЫ включают представления». и зарубежные столы).
На этой странице также обсуждается использование ролей и привилегии, называемой "все привилегии".
Также представлена информация о том, как функции GRANT сравниваются со стандартами SQL.
источник