4.6 授权 4.6.1 权限的授予与收回

4.6 授权

我们可能会给一个用户在数据库的某些部分授予几种形式的权限。

数据的授权

数据的授权包括:

  • 授权读取数据。
  • 授权插入新数据。
  • 授权更新数据。
  • 授权删除数据。

每种类型的授权都称为一个权限(privilege)。我们可以在数据库的某些特定部分(如一个关系或视图)上授权给用户所有这些类型的权限,或者完全不授权,或者这些权限的一个组合。
当用户提交查询或更新时,SQL执行先基于该用户曾获得过的权限来检查此查询或更新是否是授权过的。如果查询或更新没有经过授权,那么将拒绝执行这个查询或更新

数据库模式上的授权

除了在数据上的授权之外,用户还可以被授予在数据库模式上的权限,例如,可以允许用户创建修改删除关系。

权限转授 权限回收

拥有某些形式的权限的用户还可以把这样的权限转授(授予)给其他用户,或者撤销收回)一种此前授出的权限。本节我们将学习每个这样的权限是如何用SQL来指定的。

数据库管理员

最大的授权形式是被授予数据库管理员的。数据库管理员可以授权新用户重构数据库,等等这种权限方式和操作系统中的超级用户、管理员或操作员的权限是类似的。

4.6.1 权限的授予与收回

SQL标准包括selectinsertupdatedelete权限。
(all privileges)可以用作全部允许的权限的简写形式。一个创建了新关系的用户将自动被授予该关系上的全部权限
SQL数据定义语言包括授予收回权限的命令。

授予权限

grant语句用来授予权限。此语句的基本形式为

1
2
3
grant 权限列表
on 关系名或视图名
to 用户或角色列表;

权限列表使得一个命令可以授予多个权限。
角色的概念将在后面4.6.2节讨论。

select权限

关系上的select权限用于读取关系中的元组。下面的grant语句授予数据库用户AmitSatoshipartment关系上的select权限:

1
2
3
grant select
on department
to Amit,Satoshi;

该授权使得这些用户可以在department关系上执行查询。

update权限

关系上的update权限允许用户修改关系中的任意元组。
update权限既可以在关系的全部的属性上授予,又可以只在某些属性上授予。

在关系上的指定属性列表上授权update

如果grant语句中包括update权限,将被授予update权限的属性列表可以出现在紧跟关键字update的括号中。

默认在关系上的全部属性上授权update

属性列表是可选项,如果省略属性列表,则授予的是关系中全部属性上的update权限。
下面的grant语句授予用户AmitSatoshidepartment关系的budget属性上的更新权限:

1
2
3
grant update(budget)
on department
to Amit,Satoshi;

insert权限

关系上的insert权限允许用户往关系中插入元组。 insert权限也可以指定属性列表;对关系所作的任何插入必须只针对这些属性,系统将其余属性要么赋默认值(如果这些属性上定义了默认值),要么赋null;

delete权限

关系上的delete权限允许用户从关系中删除元组。

对public用户授权

用户名public指系统的所有当前用户和将来的用户。因此,对public的授权隐含着对所有当前用户和将来用户的授权。

我们使用revoke语句来收回权限。此语句的形式与grant几乎是一样的:

1
2
3
revoke 权限列表
on 关系名或视图名
from 用户或角色列表;

因此,要收回前面我们所授予的那些权限,我们书写下列语句:

1
2
3
revoke select
on department
from Amit,Satoshi;
1
2
3
revoke update(budget)
on department
from Amit,Satoshi;

如果被收回权限的用户已经把权限授予了其他用户,权限的收回会更加复杂。我们将在4.6.5节回到这个问题。

MySQL 8.0 grant语句报错: You are not allowed to create a user with GRANT

1
2
3
4
mysql> grant select
on department
to Amit,Satoshi;
1410 - You are not allowed to create a user with GRANT

这是因为MySQL 8.0以前的版本可以使用grant在授权的时候隐式的创建用户,MySQL 8.0以后已经不支持,所以必须先创建用户,然后再授权。