总结:康标
email:kang_biao@hotmail.com
http://www.oracle.com.cn/thread-119327-1-1.html
public是一个特殊的角色,但是在角色的视图上是没有办法查询到的:
SQL> select * from dba_roles where role='PUBLIC';
ROLE PASSWORD_REQUIRED
------------------------------ -----------------
SQL>
public应该是oracle预定义的,在sql.bsp文件中找到这个的由来:
create user sys identified by "D_SYSPW" / create role public / create role connect / grant create session to connect / |
这里可以看到这个角色是在sys用户之后建立的。在查询user$表的时候,也是证实了这一点。
USER# NAME TYPE# ---------- ------------------------------ ---------- 0 SYS 1 1 PUBLIC 0 2 CONNECT 0 3 RESOURCE 0 4 DBA 0 |
对于这个PUBLIC,如果将权限赋予PUBLIC就意味这将该权限授予了该数据库的所有用户。
对于能否将PUBLIC撤销哪?让我们先看看在PUBLIC中有那些东西:
SQL> select count(*) from dba_tab_privs where grantee='PUBLIC'; COUNT(*) ---------- 19962 SQL> select table_name from dba_tab_privs a where a.grantee='PUBLIC' and rownum < 5; TABLE_NAME ------------------------------ DUAL SYSTEM_PRIVILEGE_MAP TABLE_PRIVILEGE_MAP STMT_AUDIT_OPTION_MAP SQL> |
可以看到这里面有很多表的权限,有1900之多。这些是作为一个用户所必备的权限。例如有很多视图,数据字典等等都是需要这个PUBLIC来进行授权。如果没有这些权限,就是你有了CONNECT权限,你还是无法登陆到数据中。所以这PUBLIC不能被删除。
其实你也删除不了PUBLIC。
SQL> show user User is "SYS" SQL> drop role public; drop role public ORA-01935: 缺失用户或角色名 SQL> revoke public from a; revoke public from a ORA-01951: ROLE 'PUBLIC' 未授予 'A' |
而系统权限在PUBLIC中是没有的。
SQL> select count(*) from dba_sys_privs a where a.grantee='PUBLIC';
COUNT(*)
----------
0
所以以上的问题,需要将你不赋予的表的权限从PUBLIC上删除,可以另外建立一个role进行。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/222350/viewspace-916725/ ,如需转载,请注明出处,否则将追究法律责任。