授权ID:用户名
授权ID可以被授予权限
public:特殊的授权ID,包含了所有用户
权限
SQL定义了九种类型的权限:select,insert,delete,update,reference,usage,trigger,execute,under
一条SQL语句如果没有相应权限是不能执行的
select,insert,update也可以有一些相关的属性select(name,addr)
查询时只有这些属性可以看到,插入时只能指明这些属性的值,修改时也只能修改这些属性
reference也可以有一些附加属性,只有这些属性在约束中可以被引用
一个约束只有在它所在模式的拥有者拥有该约束涉及的所有数据的reference权才能被创建
usage权限:在声明中使用这些元素的权利
trigger权限:定义这个关系上的触发器的权利
execute权限:执行如PSM过程或函数之类的代码的权利
under权限:创建给定类型的子类型的权利
创建权限
SQL元素(如模式或模块)都有一个属主
三中建立属主的情况
1.创建模式的用户:模式创建时,模式和该模式中所有的表以及其它模式元素的所有权都属于创建这个模式的用户,这个用户拥有模式元素的所有可能的权限
2.connect时用authorization子句指定
connect to starfleet-sql-serve as conn1
authorization kirk;
3.模块创建时用authorization子句指定
模块创建语句中的子句
authorization picard
模块也可以不指定属主,这种情况下模块被公开执行,执行模块中的任何操作所
必须的权限要从别处获得,例如在模块执行过程中连接和会话与用户的关联。
因此每个模式,会话,模块都会有一个相关用户,属主,即授权ID
SQL操作有两部分:
1.数据库元素,操作将在其上执行
2.产生操作的代理
对代理有效的权限来自当前授权ID
当前授权ID可以是
1.模块授权ID(如果代理正在执行的模块有一个授权ID)
2.会话授权ID
SQL操作能不能执行就看当前授权ID有没有权限
![](https://img.haomeiwen.com/i8505225/b072b930720267b8.jpg)
授权
每个权限有一个相关的授权选项,决定能不能把权限授予别人
grant <权限列表> on <数据库元素> to <用户列表> (with grant option)
典型的数据库元素是一个关系,基本表或视图
权限列表可以直接用all privileges,表示授权者在被讨论的数据库元素上的合法授权的所有权限
合法授权是指拥有带授权选项的这些权限
例
用户janeway是movieSchema模式的属主,该模式包括表
movies(title,year,length,genre,studioName,producerC#)
studio(name,address,presC#)
janeway进行如下授权
grant select,insert on studio to kirk,picard
with grant option
grant select on movies to kirk,picard
with grant option
picard进行如下授权
grant select,insert on studio to sisko
grant select on movies to sisko
kirk进行如下授权
grant select,insert(name) on studio to sisko
grant select on movies to sisko
授权图
节点对应一个用户的一个权限(带不带授权选项是不同的权限,一个权限比另一个更通用的情况也要算两个权限)
带一个星号的表示该权限带有授权选项
带两个星号的表示该权限不是别的用户授予的,而是来自正在讨论的数据库的元素的所有权(比如模式的属主)(当然也是带授权选项的,相当于祖先一样)
![](https://img.haomeiwen.com/i8505225/b3f94c868a792297.jpg)
收权
级联
revoke <权限列表> on <数据库元素> from <用户列表> cascade
收回指定权限时,也要收回那些仅由要收回的权限而被授予的权限
若发生级联就不授权
revoke <权限列表> on <数据库元素> from <用户列表> restrict
如果收回一个权限会导致级联的发生,那这个收权语句不执行
用revoke grant option for
代替revoke
:保留权限但收回授予别人的权利(去掉授权选项)(也可以cascade或restrict)
网友评论