4.6 授权
我们可能会给一个用户在数据库的某些部分授予几种形式的权限。
对数据
的授权
对数据
的授权包括:
- 授权
读取
数据。 - 授权
插入
新数据。 - 授权
更新
数据。 - 授权
删除
数据。
每种类型的授权都称为一个权限(privilege
)。我们可以在数据库的某些特定部分(如一个关系或视图)上授权给用户所有这些类型的权限,或者完全不授权,或者这些权限的一个组合。
当用户提交查询或更新时,SQL
执行先基于该用户曾获得过的权限来检查此查询或更新是否是授权过的。如果查询或更新没有经过授权,那么将拒绝执行这个查询或更新。
数据库模式上的授权
除了在数据上的授权之外,用户还可以被授予在数据库模式
上的权限,例如,可以允许用户创建
、修改
或删除
关系。
权限转授 权限回收
拥有某些形式的权限的用户还可以把这样的权限转授
(授予)给其他用户,或者撤销收回)一种此前授出的权限。本节我们将学习每个这样的权限是如何用SQL
来指定的。
数据库管理员
最大的授权形式是被授予数据库管理员的。数据库管理员可以授权新用户
、重构数据库
,等等这种权限方式和操作系统中的超级用户、管理员或操作员的权限是类似的。
4.6.1 权限的授予与收回
SQL
标准包括select
、 insert
、 update
和delete
权限。
(all privileges
)可以用作全部允许的权限的简写形式。一个创建了新关系的用户将自动被授予该关系上的全部权限SQL
数据定义语言包括授予
和收回权限
的命令。
授予权限
grant
语句用来授予权限。此语句的基本形式为
1 | grant 权限列表 |
权限列表使得一个命令可以授予多个权限。
角色的概念将在后面4.6.2节讨论。
select权限
关系上的select
权限用于读取关系中的元组。下面的grant
语句授予数据库用户Amit
和Satoshi
在partment
关系上的select
权限:
1 | grant select |
该授权使得这些用户可以在department
关系上执行查询。
update权限
关系上的update
权限允许用户修改关系中的任意元组。update
权限既可以在关系的全部的属性上授予,又可以只在某些属性上授予。
在关系上的指定属性列表上授权update
如果grant
语句中包括update
权限,将被授予update
权限的属性列表
可以出现在紧跟关键字update
的括号中。
默认在关系上的全部属性上授权update
属性列表是可选项,如果省略属性列表,则授予的是关系中全部属性上的update
权限。
下面的grant
语句授予用户Amit
和Satoshi
在department
关系的budget
属性上的更新权限:
1 | grant update(budget) |
insert权限
关系上的insert
权限允许用户往关系中插入元组。 insert
权限也可以指定属性列表
;对关系所作的任何插入必须只针对这些属性,系统将其余属性要么赋默认值(如果这些属性上定义了默认值),要么赋null
;
delete权限
关系上的delete
权限允许用户从关系中删除元组。
对public用户授权
用户名public
指系统的所有当前用户和将来的用户。因此,对public
的授权隐含着对所有当前用户和将来用户的授权。
我们使用revoke
语句来收回权限。此语句的形式与grant
几乎是一样的:
1 | revoke 权限列表 |
因此,要收回前面我们所授予的那些权限,我们书写下列语句:
1 | revoke select |
1 | revoke update(budget) |
如果被收回权限的用户已经把权限授予了其他用户,权限的收回会更加复杂。我们将在4.6.5节回到这个问题。
MySQL
8.0 grant语句报错: You are not allowed to create a user with GRANT
1 | mysql> grant select |
这是因为MySQL 8.0
以前的版本可以使用grant
在授权的时候隐式的创建用户
,MySQL 8.0
以后已经不支持,所以必须先创建用户,然后再授权。
原文链接: 4.6 授权 4.6.1 权限的授予与收回