CodeGym /课程 /SQL SELF /角色的创建和管理:ROLES

角色的创建和管理:ROLES

SQL SELF
第 47 级, 课程 1
可用

角色 在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 组分配表的权限,组里所有人都自动有权限啦!

实战练习

  1. 创建一个 exams 表,字段如下:
    • id: 主键;
    • subject: 文本;
    • teacher_id: 教师ID。
CREATE TABLE exams (
    id SERIAL PRIMARY KEY,
    subject TEXT NOT NULL,
    teacher_id INT
);
  1. 创建 students 和 teachers 角色组。
CREATE ROLE students;
CREATE ROLE teachers;
  1. 给 teachers 组分配添加和修改 exams 表数据的权限。
GRANT INSERT, UPDATE ON exams TO teachers;
  1. 给 students 组只分配查数据的权限。
GRANT SELECT ON exams TO students;
  1. 创建一个 alice 用户,把她加到 students 组。
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
  1. 用 alice 的账号连上去,看看她有啥权限。

现在你已经知道怎么创建角色、管理权限、用组角色让管理更轻松啦。下一节我们会讲怎么用 GRANT 和 REVOKE 命令,搞更细致的数据库、schema和表级别的权限管理。

2
任务
SQL SELF, 第 47 级, 课程 1
已锁定
创建组角色并分配用户
创建组角色并分配用户
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION