CodeGym /课程 /SQL SELF /用GRANT和REVOKE设置访问权限

用GRANT和REVOKE设置访问权限

SQL SELF
第 47 级 , 课程 2
可用

想象一下,你的数据就像一座堡垒,每个堡垒里的居民都有自己的权限:有的人只能在院子里溜达,有的人拿着宝库的钥匙,还有的人坐在王座厅里掌控一切。在数据库里,这些角色就是靠 GRANTREVOKE 命令来实现的。它们就是用来决定谁能去哪、能干啥的。

GRANT命令就像发放通行证,可以把资源(比如数据库、表、schema)的访问权限给某些角色。就像“派对邀请函”,你决定谁能看、谁能写、谁能把家具砸了。

REVOKE命令反过来,就是把之前发的权限收回。就像说:“嘿,派对结束了,你的钥匙放门口。”

GRANT 授权

先从最高级别——数据库本身说起。要让用户能连上数据库,得先给他连接权限。用这个命令:

GRANT CONNECT ON DATABASE database_name TO role_name;

比如我们有个数据库叫 university,有个角色叫 student,想让学生能连上数据库,可以这样写:

GRANT CONNECT ON DATABASE university TO student;

不过,光能连上还不代表能为所欲为。要让用户能在数据库里创建对象,还得给他创建权限:

GRANT CREATE ON DATABASE university TO student;

你可以用这个命令来查看数据库的权限:

\l+ university

REVOKE 收回权限

如果学生突然开始搞事情(比如建了一堆我们没想到的表),我们可以用这个命令收回他的创建权限:

REVOKE CREATE ON DATABASE university FROM student;

这样学生就只能连数据库,不能再“自由发挥”了。

在schema级别设置权限

schema其实就是数据库里的“房间”,里面放着表、视图和其他对象。要让用户能操作schema里的对象,可以设置读、写或创建对象的权限。

给schema授权

比如我们有个叫 public 的schema(每个数据库默认都有)。我们可以让用户能看schema里的内容:

GRANT USAGE ON SCHEMA public TO student;

不过光有 USAGE 还不够,要让用户能创建新对象,还得加上:

GRANT CREATE ON SCHEMA public TO student;

这样,student就能在 public 这个schema里读和建表了。

收回schema权限

如果student开始往schema里塞一堆奇怪的表,比如 bad_idea_01,我们可以限制他的权限:

REVOKE CREATE ON SCHEMA public FROM student;

现在student就不能再加新表了。世界又恢复了秩序!

在表级别设置权限

表大概是数据库里最常用的对象了。我们来看看怎么给表设置访问权限。主要有三类操作:读、写、改。

读权限

要让用户能读表里的内容,用这个命令:

GRANT SELECT ON TABLE table_name TO role_name;

比如让student能读 courses 表:

GRANT SELECT ON TABLE courses TO student;

现在 student 用户就能用 SELECTcourses 表了。

写权限

想让用户能往表里插新行,可以这样:

GRANT INSERT ON TABLE table_name TO role_name;

例子:

GRANT INSERT ON TABLE courses TO student;

现在student能往表里加新课程了。但等等……我们确定这真是个好主意吗?

改和删的权限

要让用户能更新或删除已有行,需要给 UPDATEDELETE 权限。

GRANT UPDATE ON TABLE courses TO student;
GRANT DELETE ON TABLE courses TO student;

小建议:别乱给这些权限。如果让学生能删数据,他们可能一不小心(或者故意)把一切都搞砸。

例子:创建权限有限的角色

假设我们要给老师建个角色,让他们能看学生和课程的数据,但不能删记录。可以这样做:

  1. 创建角色:
CREATE ROLE teacher;
  1. studentscourses 表读权限:
GRANT SELECT ON TABLE students, courses TO teacher;
  1. 限制删除权限:
REVOKE DELETE ON TABLE students, courses FROM teacher;

这样老师们就只有需要的权限,啥都删不了。

怎么灵活组合 GRANTREVOKE

比如我们有个 intern 角色,想让他只能访问课程数据,绝不能碰学生数据。可以这样:

  1. 只给 courses 表授权:
GRANT SELECT, INSERT ON TABLE courses TO intern;
  1. 确保 intern 没有 students 表的权限:
REVOKE ALL ON TABLE students FROM intern;

这样就能精确控制访问权限了。

实际项目中的用法例子

这种权限管理机制在实际项目里用得很多。比如:

  1. 在电商网站,用户表和订单表的权限会分给“管理员”、“操作员”和“游客”这些角色。
  2. 在大学系统里,管理员能加改课程,学生只能看。
  3. 在银行系统里,不同部门的员工对客户账户的访问权限都不一样。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION