Я создал базу данных PostgreSQL (версия 11.5) и хочу создать два основных типа основных ролей (readonly
и readwrite
), а затем назначить эти роли отдельным лицам (user1
, user2
). , et c.).
Я читал документацию PostgreSQL и следую за этой статьей в качестве примера: https://aws.amazon.com/blogs/database/managing-postgresql-users-and-roles/
Однако Я не смог правильно установить разрешения. По сути, я хочу, чтобы роль readwrite
могла создавать любые схемы и / или таблицы, которые они хотят в этой базе данных, и я хочу, чтобы роль readonly
могла SELECT
из любой из схем и / или таблиц. в этой базе данных. Однако, следуя моему примеру ниже, user2
может создать таблицу, но user1
не имеет доступа к этой таблице.
Я создал следующий скрипт, который я могу запустить как основной пользователь для базы данных для создания базы данных, схемы и ролей.
Команда для запуска SQL script:
psql -h <INSERT HOST HERE> -U postgres -W -f create_db.sql
Содержимое create_db. sql
-- drop the existing database
DROP DATABASE IF EXISTS new_db;
-- create the database
CREATE DATABASE new_db;
-- connect to the database
\c new_db
-- create the new schema
CREATE SCHEMA new_schema;
-- revoke privileges from 'public' role
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
REVOKE ALL ON DATABASE new_db FROM PUBLIC;
-- create readonly role
DROP ROLE IF EXISTS readonly;
CREATE ROLE readonly;
GRANT CONNECT ON DATABASE new_db TO readonly;
GRANT USAGE ON SCHEMA new_schema TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA new_schema TO readonly;
ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT SELECT ON TABLES TO readonly;
-- create read/write role
DROP ROLE IF EXISTS readwrite;
CREATE ROLE readwrite;
GRANT CONNECT, CREATE ON DATABASE new_db TO readwrite;
GRANT USAGE, CREATE ON SCHEMA new_schema TO readwrite;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA new_schema TO readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO readwrite;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA new_schema TO readwrite;
ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT USAGE ON SEQUENCES TO readwrite;
-- create users
DROP USER IF EXISTS user1;
DROP USER IF EXISTS user2;
CREATE USER user1 WITH PASSWORD 'password';
CREATE USER user2 WITH PASSWORD 'password';
-- grant privileges to users
GRANT readonly TO user1;
GRANT readwrite TO user2;
После успешного запуска сценария я могу запустить следующий сценарий как user2
, чтобы создать таблицу в новой схеме.
Команда для запуска SQL script
psql -h <INSERT HOST HERE> -d new_db -U user2 -W -f create_.sql
Содержание of create_table. sql
-- drop the existing table
DROP TABLE IF EXISTS new_schema.new_table;
-- create a new table
CREATE TABLE new_schema.new_table (name VARCHAR, age INT);
-- insert data into the new table
INSERT INTO new_schema.new_table (name, age) VALUES ('Bob', 42);
Теперь, если user1
(только для чтения) регистрируется в базе данных, я надеюсь, что они смогут SELECT
из этой вновь созданной таблицы, однако, похоже, у них нет правильного доступа. Они могут видеть таблицу, но не запрашивать ее.
psql -h <INSERT HOST HERE> -d new_db -U user1 -W
new_db=> \dt new_schema.*
List of relations
Schema | Name | Type | Owner
------------+-----------+-------+-------
new_schema | new_table | table | user2
(1 row)
new_db=> SELECT * FROM new_schema.new_table;
ERROR: permission denied for table new_table