加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SQL中的授权 -- grant​、revoke

(2014-02-12 15:36:51)
分类: 数据库

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

  • 读取数据权限

  • 插入数据权限

  • 更新数据权限

  • 删除数据权限

我们可以在数据库的某些特定部分(如一个关系或视图)上授权给用户所有这些类型的权限,或者完全不授权,或者只授权其中的一个组合

当用户提交查询或更新时,SQL首先查看该用户曾获得过的授权,如果该用户没有获得过相应的授权,那么操作将会被拒绝执行

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

拥有某些形式权限的用户还可以把这样的权限授予其他用户,或者撤销一种此前授出的权限


一、权限的授予和收回 -- grant、revoke


SQL标准权限包括:selectinsertupdatedeleteall privileges


grant语句用来授予权限:

grant <权限列表>

on <关系名或视图名>

to <用户/角色列表>

如:

grant select on department to Amit, Satoshi;

下面的grant语句授予用户只能在 department 关系的 budget 属性上执行更新操作:

grant update (budget) on department to public;

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


在默认情况下,被授权的用户无权把此权限授予其他用户,但SQL允许使用授予权限来指定权限的接受者可以进一步把权限授予其他用户,后面进行相关讨论


revoke语句用来收回权限:

revoke <权限列表>

on <关系名或视图名>

from <用户/角色列表>

因此,要收回之前我们所授予的权限,可以如下书写:

revoke select on department from Amit, Satoshi;

如果被收回权限的用户已经把权限授予了其他用户,权限的收回会更加复杂,同样,我们稍后进行相关的讨论


二、角色 -- role

在一个系统中,常常有一类人有着相同的角色,比如一个学校中,所有的老师应该有相同的权限,因此,我们需要以一种更好的方式授予权限而不是为每一位教师单独授予权限

这个问题的一个解法是建立一个具有某种权限的用户标识,允许每位教师通过这个用户标识连接数据库,但是这种方式数据库无法区分是哪位教师在进行操作,从而会产生出安全隐患

另一种方式是在数据库中建立角色集,为角色集中的每一个用户自动的授予权限,任何可以授予给普通用户的权限都可以授予角色

如:

create role instructor;

然后我们可以为角色授予权限,与为用户授予权限并没有什么区别:

grant select on takes to instructor;


角色可以授予用户也可以授予其他角色:

grant dean to Amit;

create role dean;

grant instructor to dean;


三、视图的授权 -- view

我们常常需要对某个视图赋予一定的权限,比如某员工只能看到一个给定系的教师工资,但是他不能看到其他系的相关信息,我们就需要定义一个视图

create view geo_instructor as

(select *

from instructor

where dept_name = 'Geology');

该员工使用如下SQL语句进行查询:

select *

from geo_instructor;

创建视图的用户并不需要获得该视图上的所有权限,他得到的那些权限不会超越他已有的权限,也就是说,如果一个用户在定义视图的关系上没有update权限,他也无法获得视图上的update权限,系统会拒绝这样的视图创建请求


四、模式的创建

SQL标准为数据库模式指定了一种基本的授权机制:只有模式的拥有者才能执行对模式的任何修改,诸如创建或删除关系的属性,增加或删除关系的属性,以及增加或删除索引

然而,SQL提供了一种references 权限,允许用户在创建关系时声明外码,references 也可以授予到特定属性上:

grant references (dept_name) on department to Mariano;

reference权限存在的意义是:如果Mariano在关系r中创建了一个外码,它参照department关系的dept_name属性,但是一旦在r中插入一条属于Geology系的元组,那么就再也不能从department关系中将Geology系删除,除非同时也修改关系r,这样Mariano限制了别的用户的行为,因此需要一定的权限来允许这样的限制


五、权限的转移 -- with grant option

在默认方式下,获得授权的用户不能将得到的权限再授予给另外的用户或角色,如果我们在授权时允许接受者把得到的权限再授予其他角色,我们可以在相应的grant语句的后面附加 with grant option 子句:

grant select on department to Amit with grant option;


六、权限的收回

当一个用户权限被管理员收回,他所授予出的权限也应该被收回,这被称为“级联收回”,大部分数据库系统实现中,级联收回是默认行为,但是我们可以通过指定 restrict 来申明拒绝级联收回:

revoke select on department from Amit restrict;

一旦系统检测到有级联收回的情况,就会返回一个错误,而拒绝收回的执行

级联收回在大部分情况中是不合适的

你也可以用 cascade 代替restrict 来申明需要进行级联收回

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有