PostgreSQL用户和权限管理

· 1525字 · 4分钟

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 USERCREATE GROUP可以看成是CREATE ROLE的别名命令。最主要的区别是user在默认创建时会有login的权限,而rolegroup没有登录权限。

CREATE USER user_name WITH PASSWORD 'passwd';
--等价于
CREATE ROLE user_name WITH LOGIN PASSWORD 'passwd';

​ PostgreSQL默认创建一个名为publicschema,并将这个schema的访问权授予一个名为public的角色。所有新的用户和角色都被默认授予这个public角色并可以在public schema中创建对象。

​ 在创建一个只读的用户时,即使限制了所有权限,但是通public角色继承的权限也允许用户在public schema中创建对象。要解决这个问题,应该从public角色撤销public schema上的默认CREATE权限。

--撤销public schema上的 CREATE 权限
REVOKE CREATE ON SCHEMA public FROM PUBLIC;