TL;DR 🔗
创建角色 🔗
--创建角色
CREATE ROLE role_name;
--授予角色连接数据库和使用schema的权限(只读角色)
GRANT CONNECT ON DATABASE database_name TO role_name;
GRANT USAGE ON SCHEMA schema_name TO role_name;
--授予角色连接数据库和读写schema的权限(读写角色)
GRANT CONNECT ON DATABASE database_name TO role_name;
GRANT USAGE, CREATE ON SCHEMA schema_name TO role_name;
--授予角色对某些表或者所有表的只读权限(只读角色)
GRANT SELECT ON TABLE table1, table2 TO role_name;
GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO role_name;
--授予角色对某些表或者所有表的读写权限(读写角色)
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE table1, table2 TO role_name;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA schema_name TO role_name;
--自动授予角色对新增表的权限(只读角色)
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT SELECT ON TABLES TO role_name;
--自动授予角色对新增表的权限(读写角色)
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO role_name;
--授予角色使用某些序列或者所有序列的权限(读写角色)
GRANT USAGE ON SEQUENCE seq1, seq2 TO role_name;
GRANT USAGE ON ALL SEQUENCES IN SCHEMA schema_name TO role_name;
--自动授予角色对新增序列的权限(读写角色)
ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT USAGE ON SEQUENCES TO role_name;
创建用户并授权 🔗
--创建用户
CREATE USER user_name WITH PASSWORD 'passwd';
--授权用户
GRANT role_name TO user_name;
Description 🔗
在pgsql
中,user、group、role
是一样的概念,所以CREATE USER
和CREATE GROUP
可以看成是CREATE ROLE
的别名命令。最主要的区别是user
在默认创建时会有login
的权限,而role
和group
没有登录权限。
CREATE USER user_name WITH PASSWORD 'passwd';
--等价于
CREATE ROLE user_name WITH LOGIN PASSWORD 'passwd';
PostgreSQL默认创建一个名为public
的schema
,并将这个schema
的访问权授予一个名为public的角色。所有新的用户和角色都被默认授予这个public
角色并可以在public schema
中创建对象。
在创建一个只读的用户时,即使限制了所有权限,但是通public
角色继承的权限也允许用户在public schema
中创建对象。要解决这个问题,应该从public
角色撤销public schema
上的默认CREATE
权限。
--撤销public schema上的 CREATE 权限
REVOKE CREATE ON SCHEMA public FROM PUBLIC;