通过grant语句可以将系统权限和角色授予用户或者角色。但是必须满足如下的条件:
- 对于系统权限,执行用户需要具有 GRANT ANY PRIVILEGE权限或者具有被授予的权限(WITH ADMIN OPTIONS)
- 对于角色,执行用户需要具有GRANT ANY ROLE系统权限或者具有被授予角色(with admin options)
with admin option:
- 只是针对系统权限和角色,对于对象权限不可以使用
- 被授予用户可以授予或者回收其该系统权限或者角色,用户不可以回收自己的权限和角色
- 被授予用户可以使用该权限和角色的with admin option选项
- 被授予用户可以删除或者更改被授予的角色(drop or alter)
with grant option:
- 只限于对象权限,
- 必须是对象的拥有者,或者具有grant any object privilege系统权限,或者具有相应权限(with grant option)
- 如果用户具有某表的对象权限(with grant option),并依附该表创建视图,那么该用户可以授权视图的权限给其他用户
- 当我们将对象权限(with grant option)赋予某角色,拥有该角色的用户不会继承或者传播WITH GRANT OPTION
如果某个用户具有GRANT ANY OBJECT PRIVILEGE系统权限,那么他可以管理其他用户的对象权限。此时在dba_tab_privs中相应记录的grantor字段值为对象的拥有者,即GRANT ANY OBJECT PRIVILEGE具有替代对象拥有者执行权限管理的特点。
如果某个用户A,具有其他用户B的对象权限(with grant option),那么当用户A授权该对象权限给其他用户时,DBA_TAB_PRIVS 中的对应GRANTOR字段为用户A。
SQL> grant grant any object privilege to scott;
SQL> conn scott/tiger
已连接。
SQL> grant select on easy.tab1 to tts with grant option;
授权成功。
SQL> grant select on easy.tab1 to abcd ;
授权成功。
SQL> CONN tts/tts
已连接。
SQL> show user
USER 为 "TTS"
SQL> grant select on easy.tab1 to sh;
SQL> /
GRANTEE GRANTOR PRIVILEGE GRA
------------------------------ ------------------------------ ---------------------------------------- ---
SH TTS SELECT NO
ABCD EASY SELECT NO
TTS EASY SELECT YES
我们还可以在列级别管理用户的对象权限,例如
GRANT INSERT (acct_no) ON accounts TO psmith;
另外,通过VPD和ORACLE Label Security(OLS),ORACLE 为我们提供了行级别的控制能力,有兴趣的同学可以查看官方文档。
贴士:我们可以使用grant语句来创建用户,例如GRANT CREATE SESSION TO NEW_USER IDENTIFIED BY PASSWORD,如果new_user不存在,则以password为密码创建用户new_user。
贴士:系统权限和对象权限不可以在同一个grant语句中赋予。