前一篇介绍了用户只能回收自己授权的权限,这篇继续讨论拥有GRANT ANY OBJECT PRIVILEGE权限时的回收权限。
授权对象权限后的授权者显示问题:http://yangtingkun.itpub.net/post/468/506156
对象权限的回收:http://yangtingkun.itpub.net/post/468/506207
这里继续使用《授权对象权限后的授权者显示问题》中的例子,来演示拥有GRANT ANY OBJECT PRIVILEGE权限后对象权限的回收。
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
用户U_GRANTEE的SELECT权限是表的拥有者YANGTK授权的;INSERT权限是拥有WITH GRANT OPTION的U_WITH_GRANT用户授权的;UPDATE权限是拥有GRANT ANY OBJECT PRIVILEGE权限的U_GRANT_ANY用户授权的,这时GRANTOR显示的仍然是表的OWNER;最后DELETE权限是拥有WITH GRANT OPTION和GRANT ANY OBJECT PRIVILEGE权限的U_WITH_GRANT_AND_ANY用户授权的。
在上一篇权限的回收提到了一个用户可以被多个用户授予相同的权限,从而在数据字典中可以查询到多条记录。那么拥有GRANT ANY OBJECT PRIVILEGE权限的用户是如何回收授权的:
SQL> CONN U_GRANT_ANY/PASSWORD
已连接。
SQL> REVOKE UPDATE ON YANGTK.T FROM U_GRANTEE;
撤销成功。
SQL> REVOKE SELECT ON YANGTK.T FROM 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
由于拥有GRANT ANY OBJECT PRIVILEGE系统权限的用户授权后,显示的GRANTOR为对象的OWNER,因此这种用户可以回收GRANTOR为OWNER的授权,即使这个授权并非是当前用户授权的。
这种情况其实比较简单,对于同时拥有GRANT ANY OBJECT PRIVILEGE和WITH GRANT OPTION权限的用户而言,回收对象权限更复杂一些:
SQL> GRANT DELETE 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 U_WITH_GRANT_AND_ANY DELETE NO NO
U_GRANTEE YANGTK T U_WITH_GRANT INSERT NO NO
U_GRANTEE YANGTK T YANGTK DELETE NO NO
SQL> CONN U_WITH_GRANT_AND_ANY/PASSWORD
已连接。
SQL> REVOKE DELETE ON YANGTK.T FROM 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 DELETE NO NO
SQL> CONN U_WITH_GRANT_AND_ANY/PASSWORD
已连接。
SQL> REVOKE DELETE ON YANGTK.T FROM 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
这种用户回收对象权限时,会先回收GRANTOR为当前用户的权限,如果再次执行回收操作或者GRANTOR为当前用户的授权不存在时,会回收GRANTOR为OWNER的权限。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-675132/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/4227/viewspace-675132/