对用户授予对象权限后,查询数据字典,数据字典中记录的授权者并不一定是真正授权的用户。
能授予对象权限的只有三种情况:一、对象的OWNER;二、被授予对象权限且包含WITH GRANT OPTION权限;三、用户拥有GRANT ANY OBJECT PRIVILEGE权限:
SQL> CREATE USER U_GRANTEE IDENTIFIED BY PASSWORD;
用户已创建。
SQL> CREATE USER U_WITH_GRANT IDENTIFIED BY PASSWORD;
用户已创建。
SQL> CREATE USER U_GRANT_ANY IDENTIFIED BY PASSWORD;
用户已创建。
SQL> CREATE USER U_WITH_GRANT_AND_ANY IDENTIFIED BY PASSWORD;
用户已创建。
SQL> SHOW USER
USER 为 "YANGTK"
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> GRANT SELECT ON T TO U_GRANTEE;
授权成功。
SQL> SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'U_GRANTEE';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
---------- ---------- ---------- -------------------- ---------- --- ---
U_GRANTEE YANGTK T YANGTK SELECT NO NO
对于第一种情况没有什么特别之处,对象的OWNER授权后,显示的授权者就是OWNER。
SQL> GRANT INSERT ON T TO U_WITH_GRANT WITH GRANT OPTION;
授权成功。
SQL> GRANT CREATE SESSION TO U_WITH_GRANT;
授权成功。
SQL> CONN U_WITH_GRANT/PASSWORD
已连接。
SQL> GRANT INSERT ON YANGTK.T TO U_GRANTEE;
授权成功。
SQL> CONN YANGTK/YANGTK
已连接。
SQL> SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'U_GRANTEE';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
---------- ---------- ---------- -------------------- ---------- --- ---
U_GRANTEE YANGTK T U_WITH_GRANT INSERT NO NO
U_GRANTEE YANGTK T YANGTK SELECT NO NO
第二种情况也很正常,当拥有WITH GRANT OPTION的用户授权时,显示的GRANTOR就是执行授权命令的用户。
SQL> GRANT GRANT ANY OBJECT PRIVILEGE TO U_GRANT_ANY;
授权成功。
SQL> GRANT CREATE SESSION TO U_GRANT_ANY;
授权成功。
SQL> CONN U_GRANT_ANY/PASSWORD
已连接。
SQL> GRANT UPDATE ON YANGTK.T TO U_GRANTEE;
授权成功。
SQL> CONN YANGTK/YANGTK
已连接。
SQL> SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'U_GRANTEE';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
---------- ---------- ---------- -------------------- ---------- --- ---
U_GRANTEE YANGTK T U_WITH_GRANT INSERT NO NO
U_GRANTEE YANGTK T YANGTK UPDATE NO NO
U_GRANTEE YANGTK T YANGTK SELECT NO NO
第三种情况比较特别,对于拥有GRANT ANY OBJECT PRIVILEGE系统权限的用户,授权后,显示的GRANTOR是OWNER,而并不是执行授权命令的用户。
其实还有第四种情况,就是用户同时拥有对象的WITH GRANT OPTION和GRANT ANY OBJECT PRIVILEGE系统权限:
SQL> GRANT GRANT ANY OBJECT PRIVILEGE TO U_WITH_GRANT_AND_ANY;
授权成功。
SQL> GRANT DELETE ON T TO U_WITH_GRANT_AND_ANY WITH GRANT OPTION;
授权成功。
SQL> GRANT CREATE SESSION TO U_WITH_GRANT_AND_ANY;
授权成功。
SQL> CONN U_WITH_GRANT_AND_ANY/PASSWORD
已连接。
SQL> GRANT DELETE ON YANGTK.T TO U_GRANTEE;
授权成功。
SQL> CONN YANGTK/YANGTK
已连接。
SQL> SELECT * FROM DBA_TAB_PRIVS WHERE GRANTEE = 'U_GRANTEE';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE GRA HIE
---------- ---------- ---------- -------------------- ---------- --- ---
U_GRANTEE YANGTK T U_WITH_GRANT_AND_ANY DELETE NO NO
U_GRANTEE YANGTK T U_WITH_GRANT INSERT NO NO
U_GRANTEE YANGTK T YANGTK UPDATE NO NO
U_GRANTEE YANGTK T YANGTK SELECT NO NO
当用户同时符合后两种情况,在授权时,显示的GRANTOR仍然是执行授权命令的用户,而不再是对象的OWNER。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-674978/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-674978/