角色 在PostgreSQL里可以代表一个单独的用户,也可以是一群用户。它用来管理对数据库、表、schema和其他对象的访问。
当你创建一个角色时,它默认不会和某个具体用户或组绑定,但你可以给它分配属性和权限,按你的需求来。
角色和用户的区别
那用户呢?这里别搞混了。在PostgreSQL里,用户其实也是角色,但有个区别:用户总是能登录系统。也就是说,每个角色只要有 LOGIN 属性就能当用户。如果你只是想把一堆用户放一起,或者不让它能登录,就别加 LOGIN 属性。
举个例子:
- 有
LOGIN属性的角色 = 用户。 - 没有
LOGIN的角色 = 组 或 “服务角色”。
创建角色
创建角色用 CREATE ROLE 命令。语法长这样:
CREATE ROLE <角色名> [WITH] [参数];
这里的 参数 就是角色的属性,比如:
LOGIN— 能登录数据库。CREATEDB— 能创建数据库。CREATEROLE— 能创建其他角色。SUPERUSER— 超级权限(最危险的角色,小心用)。PASSWORD— 登录用的密码。
来个创建用户角色的例子。 假设你想创建一个叫 student 的用户,能登录系统,还要有密码。你可以这样写:
CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';
这个命令会创建一个叫 student 的角色,可以连数据库了。
现在我们来创建一个叫 teachers 的组角色。组角色不需要 LOGIN 属性,因为组里的用户会用自己的账号登录。
CREATE ROLE teachers;
给角色分配权限
PostgreSQL里的角色就是用来分配或限制资源访问的。你可以用 GRANT 和 REVOKE 命令来搞定。
用 GRANT 分配权限
命令语法:
GRANT <权限> ON <对象> TO <角色>;
我们来创建一个 courses 表,然后给 teachers 角色分配读和改表数据的权限。
-- 创建表
CREATE TABLE courses (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
teacher_id INT
);
-- 分配权限
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;
现在,所有属于 teachers 角色的用户都能查、加、改这个表的数据了。
用 REVOKE 收回权限
收回权限用 REVOKE 命令。语法:
REVOKE <权限> ON <对象> FROM <角色>;
比如你想禁止 teachers 组改 courses 表的数据,就这样:
REVOKE UPDATE ON courses FROM teachers;
角色层级:继承
用户可以“继承”组角色的权限,这样管理起来更方便。就像“继承家产”一样。
关键字 INHERIT 让角色能继承别的角色的权限。这个默认是开的,你也可以关掉。
举个例子:
-- 把用户 `john` 加到 `teachers` 组
GRANT teachers TO john;
现在 john 用户自动拥有 teachers 组分配的所有权限。
查查权限:
\du john
如果你想关掉继承,创建角色时加 NOINHERIT 属性。
CREATE ROLE admin NOINHERIT;
现在 admin 角色里的用户默认就不能用它的权限了。
创建角色组来管理访问
角色组让权限管理更简单,尤其是大项目里。你不用给每个用户单独分配权限,只要把用户加到组里,再给组分配权限就行。
举个简单的组角色例子。我们来建两个组:
students— 学生组。teachers— 教师组。
CREATE ROLE students;
CREATE ROLE teachers;
把用户加到组里:
-- 把 john 加到 students 组
GRANT students TO john;
-- 把 jane 加到 teachers 组
GRANT teachers TO jane;
现在,只要给 students 和 teachers 组分配表的权限,组里所有人都自动有权限啦!
实战练习
- 创建一个
exams表,字段如下:id: 主键;subject: 文本;teacher_id: 教师ID。
CREATE TABLE exams (
id SERIAL PRIMARY KEY,
subject TEXT NOT NULL,
teacher_id INT
);
- 创建
students和teachers角色组。
CREATE ROLE students;
CREATE ROLE teachers;
- 给
teachers组分配添加和修改exams表数据的权限。
GRANT INSERT, UPDATE ON exams TO teachers;
- 给
students组只分配查数据的权限。
GRANT SELECT ON exams TO students;
- 创建一个
alice用户,把她加到students组。
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
- 用
alice的账号连上去,看看她有啥权限。
现在你已经知道怎么创建角色、管理权限、用组角色让管理更轻松啦。下一节我们会讲怎么用 GRANT 和 REVOKE 命令,搞更细致的数据库、schema和表级别的权限管理。
GO TO FULL VERSION