我已经创建了一个PostgreSQL(版本11.5)数据库,并且我想创建两种不同类型的主要角色(readonly
和readwrite
),然后将这些角色分配给个人(user1
,user2
等)。
我一直在阅读PostgreSQL文档,并以本文为例:https://aws.amazon.com/blogs/database/managing-postgresql-users-and-roles/
但是,我无法正确设置权限。基本上,我希望角色readwrite
能够在此数据库中创建他们想要的任何模式和/或表,并且我希望角色readonly
能够从任何{该数据库中的模式和/或表。但是,按照下面的示例,SELECT
可以创建一个表,但是user2
无权访问该表。
我已经创建了以下脚本,可以作为数据库的主用户运行该脚本,以创建数据库,架构和角色。
user1
psql -h <INSERT HOST HERE> -U postgres -W -f 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
psql -h <INSERT HOST HERE> -d new_db -U user2 -W -f create_.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
答案 0 :(得分:0)
对于PostgreSQL 11.7,它可以进行以下修改:
ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT SELECT ON TABLES TO readonly;
必须由 user2 运行。例如,如果我以user2的身份运行create_table.sql,并进行了上述修改:
ALTER DEFAULT PRIVILEGES IN SCHEMA new_schema GRANT SELECT ON TABLES TO readonly;
ALTER DEFAULT PRIVILEGES
CREATE TABLE new_schema.new_table (name VARCHAR, age INT);
CREATE TABLE
INSERT INTO new_schema.new_table (name, age) VALUES ('Bob', 42);
INSERT 0 1
$ psql -U user1 -d new_db
psql (11.7)
Type "help" for help.
new_db=> select * from new_schema.new_table;
name | age
------+-----
Bob | 42
(1 row)
new_db=> \dp+ new_schema.new_table;
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
------------+-----------+-------+---------------------+-------------------+----------
new_schema | new_table | table | readonly=r/user2 +| |
| | | user2=arwdDxt/user2 | |
(1 row)
我知道ALTER DEFAULT特权必须由将来涉及的对象的所有者运行。