对数据的授权包括:
- 授权读取信息
- 授权插入新数据
- 授权更新数据
- 授权删除数据
每一种类型的授权都称为一个权限。我们可以在数据库的某些特定部分(如一个关系或者视图)上授权给用户所有这些类型的权限,或者完全不授权,或者这些权限的一个组合。
当用户提交查询或者更新,SQL执行先基于该用户曾获得过的权限检查此查询或更新是否授权过得。若没有,则拒绝执行。
除了在数据上的授权外,还可以在数据库模式上的授权,例如,可以允许用户创建、修改或者删除关系。
最大的授权毫无疑问是被授予数据库管理员的。
权限的授予与收回
SQL标准包括select、insert、update和delete权限。权限所有权限(all privileges)可以用作所有允许权限的简写形式。一个创建了新关系的用户将自动被授予该关系上的所有权限。
授予权限
用grant语句授予权限:
grant <权限列表>
on <关系名或者视图名>
to <用户或者角色的列表>;
- 关系上的select权限允许用户读取关系中的元组。
例如,用grant语句授予数据库用户Amity 和Satoshi在department关系上的select权限:
#该授权是的这些用户可以在department关系上执行查询
grant select on department to Amity,Satoshi;
- 关系上的update权限允许用户修改关系中的任意元组。update权限可以在关系的所有属性上授权,又可以只在某一些属性上授权。形式:
grant update<(属性列表)> on 关系名 to 用户/角色 列表;
例如,授予Amity和Satoshi在department关系的budget更新权限:
grant update (budget)on department to Amity,Satoshi;
insert权限允许用户往关系中插入元组,可指定属性列表,使用形式与update形似。
delete权限允许用户从关系中删除元组,形似select。
在默认情况下,被授权的用户/角色无权把权限授予其他用户/角色。SQL允许用授予权限来指定权限的接受者可以进一步把权限授予其他用户。
收回权限
用revoke语句收回权限:
revoke <权限列表>
in <关系名或者视图名>
from <用户或者角色的列表>
收回权限的书写方式与授予权限的书写方式几乎一致。
如果被收回权限的用户已经把权限授予了其他用户,权限的收回会更加复杂。
#收回select权限
revoke select on department from Amity,Satoshi;
mysql也是可以支持的,所有这里我就用mysql来这一下例子:
首先,我们在登录root用户之后,创建一个用户who,并赋予who读取department关系,更新department关系中budget属性值的权限,如图:

差点忘了,每次修改权限都应该执行一下下面的语句:
#刷新权限
flush privileges;
创建用户:

接着我们就用刚创建的用户登录数据库:
首先,打开安装mysql目录的bin目录:

然后,利用刚才创建的用户登录:


如果执行语句:
INSERT INTO department VALUES ('hhh','hhh',12.0);
会报INSERT command denied to user 'who'@'localhost' for table 'department',插入命令被拒绝。

不知道为什么,我有点喜欢上了命令行操作,哈哈哈
角色
有些时候,我们不可能一一的添加权限用户,例如,每个教师必须在同一组关系上具有同种类型的权限。无论何时指定以为新的老师,他都必须被单独授予所有这些权限。
一种好的方式是指明每个老师应该被授予的权限,变单独标示出那些数据库用户是教师。而角色的概念使用于此。
创建角色:
create role instructor;
授予角色权限:
grant select on takes to instructor;
角色可以授予用户,也可以授予其他角色:
grant instructor to Amity;
grant instructor to dean(角色);
模式的授权
SQL标准为数据库模式指定了一种基本的授权机制:只有模式的拥有这才能够执行对模式的任何修改,诸如创建或删除关系,增加或者删除关系的属性,以及增加或删除索引。
SQL提供了一种reference权限,允许用户在创建创建关系是声明外码。SQL的reference权限可以和update权限类似的方式授予到特定的属性上。例如,下面的grant语句允许用户Maria创建这样的关系,它能够参照department关系的主码dept_name:
grant reference(dept_name) on department on Maria;
外码约束限制了被参照关系上的删除和更改操作。假定Maria在关系r中创建了一个外码,它参照department关系的dept_name属性,然后在r中插入一条属于Biology系的元组。那么就再也不可能从department关系中将Biology系删除,除非同时也修改关系r。这样,Maria定义的歪歪吗限制了其他用户将来的行为;因此,需要有reference权限。
权限转移
grant select on department to Amit with grant option
在grant子句后面添加with grant option表名Amit的select权限可以传递给其他用户。
权限的收回
我们假设系统管理员将对department的select权限授予用户U1,U2,U3(并且三者都有传递权限的权利),然后U1传递给U4,U5,U2传递给U5.
但我们收回U1和U2的权限时,若U4和U5也失去了权限,这样收回权限的方式称为:级联收回。在大多数据库中,级联是默认行为。我们可以在revoke语句中声明restrict来防止级联收回:
revoke select on department from Amit,Satoshi restrict;
这种情况下,如果存在任何级联收回,系统就返回一个错误,并且不执行任何收权动作。
但我们要取消某个用户能够传递权限的能力的时候,我们可以这样收回:
revoke grant option for select on department from Amit;