11.2.3 权限信息的查询

用户的系统权限和对象权限信息,都可以从数据字典视图中获得。与系统权限有关的数据字典视图包括:system_privilege_map、dba_sys_privs、user_sys_privs和session_privs。

其中从视图system_priviege_map中可以获得当前数据库中已经定义的所有系统权限。例如,下面的语句可以列出数据库中所有的系统权限:


SQL>SELECT name FROM system_privilege_map;


SYS用户可以从数据字典视图dba_sys_privs中查询任何用户所具有的系统权限,而普通用户可以从数据字典视图user_sys_privs中查询自己所拥有的系统权限。例如,下面的SELECT语句查询用户scott所拥有的系统权限:


SQL>SELECT grantee, privilege, admin_option

FROM dba_sys_privs

WHERE grantee='SCOTT';


其中列grantee指的是权限的被授予者,privilege列表示权限名称,adm列表示是否允许用户再将这个权限授予其他用户。

又如,假设当前用户是scott,下面的查询语句列出了当前用户所拥有的系统权限:


SQL>SELECT username, privilege, admin_option

FROM user_sys_privs;


这条语句与上面一条语句的执行结果是相同的。

从数据字典视图session_privs中可以查询一个用户在当前会话中所具有的系统权限。如果分别从字典视图session_privs和user_sys_privs中查询一个用户所具有的系统权限,我们会发现查询结果并不相同。这是因为,从user_sys_privs中查询到的系统权限是用户直接获得的系统权限,即sys用户通过GRANT命令授予当前用户的系统权限。而从字典视图session_privs到的系统权限不仅包括该用户直接获得的权限,还包括该用户从角色中间接获得的系统权限。

与系统权限一样,对象权限的信息也可以从数据字典视图中查询。与对象权限有关的数据字典视图包括以下几个:dba_tab_privs、dba_col_privs、user_tab_privs和user_col_privs。

其中从dba_tab_privs查询任何用户所具有的对象权限。例如,下列的SELECT语句查询用户user1所具有的对象权限:


SQL>SELECT grantee, privilege, grantor, table_name, grantable FROM dba_tab_privs WHERE grantee='USER1';


这条语句的执行结果为:


GRANTEE PRIVILEGE GRANTOR TABLE_NAME GRANTABLE

USER1 REFERENCES SCOTT DEPT NO

USER1 REFERENCES SCOTT STUDENT NO


查询结果表明,用户user1对用户scott的两个表具有REFERENCES权限,权限的授予者都是scott,并且这两个权限都不能再被user1授予其他用户。

在另一个数据字典dba_col_privs中记录了用户在列上的权限。如果REFERENCES权限、INSERT权限和UPDATE权限在授予时没有指定具体的列,那么它们将被记录在数据字典dba_tab_privs中。如果涉及了具体的列,这些列的信息可以从数据字典视图dba_col_privs中查询。例如,下面的SELECT语句查询user1所具有的列权限:


SQL>SELECT grantee, TABLE_name, column_name, privilege, grantor, grantable

FROM dba_col_privs

WHERE grantee='USER1';


这条语句的执行结果为:


grantee TABLE_name column_name privilege grantor grantable

USER1 DEPT DEPTNO REFERENCES SCOTT NO

USER1 EMP EMPNO INSERT SCOTT NO

USER1 STUDENT SNO REFERENCES SCOTT NO


从查询结果可以看出,用户user1对表dept的deptno和表student的列sno具有REFERENCES权限,对表emp的列empno具有INSERT权限,这三个权限的授予者都是用户scott,它们都不能再被user1授予其他用户。

上面两个数据字典视图只能由sys用户查询,或者由具有特权的用户查询。如果一个普通用户想查看自己所具有的对象权限,可以从另外两个数据字典视图user_tab_privs和user_col_privs中查询。例如,假设当前用户是scott,下面的SELECT语句将查询这个用户所具有的全部对象权限:


SQL>SELECT grantee, TABLE_name, column_name, privilege, grantor, grantable

FROM user_tab_privs

WHERE grantee='SCOTT';