数据库版本:11GR2
一、介绍
在oracle中没有其他数据库系统中的数据库的概念,对象都是创建在用户下。当前用户具有当前用户下所有对象的所有权限无论该对象是否是当前用户所创建。举个简单例子创建一个用户授予该用户连接权限,然后用管理员用户在该用户下创建一张表,该用户可以删除管理员在该用户下创建的表。
二、权限
权限主要可以分成三类:系统权限、角色、对象权限。角色是一类权限的分组。
1.系统权限
系统权限其实就是用户在当前用户架构下所具有的权限。在11g中系统权限有200个,比如create table,UNLIMITED TABLESPACE等。
查询当前用户拥有的系统权限:
SELECT * FROM user_sys_privs;
2.角色
角色其实就是一类权限的分组,所以给用户分配角色其实也是在给用户分配权限。在oracle中有三个比较常用的角色。对于一般不是很严格的系统可以授予开发用户CONNECT、RESOURCE角色权限即可。
DBA:该角色具有数据库所有的权限。
CONNECT:该角色具有连接数据库的权限,和create session的权限一样。
RESOURCE:该角色是应用程序开发角色,具有如下权限
查询当前用户拥有的角色:
SELECT * FROM USER_ROLE_PRIVS;
3.对象权限
对象权限指的是其它拥有用户的对象的权限。其它用户对象的权限包括:SELECT,DELETE,UPDATE,ALTER,INSERT,INDEX,REFERENCES,FLASHBACK,DEBUG,QUERY REWRITE,ON COMMIT REFRESH;注意其它用户对象的权限没有drop的权限。
查询当前用户拥有的对象权限:
SELECT * FROM USER_TAB_PRIVS;
当前用户chenmh拥有用户zhang下student表的所有权限。
三、grant授权
1.授予用户connect、resource角色权限。一般创建应用程序开发用户可以授予这两个角色的权限。
GRANT CONNECT,RESOURCE TO zhang;
2.授予用户chenmh用户zhang下person表的SELECT,DELETE,UPDATE,INSERT权限,授予具体的对象权限是对于权限严格控制的一种方案。
GRANT SELECT,DELETE,UPDATE,INSERT ON zhang.person TO CHENMH ;
3.授予用户chenmh用户zhang下person表的所有权限
GRANT ALL PRIVILEGES ON zhang.person to chenmh;
grant权限图表:
四、REVOKE回收权限
1.回收角色权限
REVOKE CONNECT,RESOURCE FROM chenmh;
2.回收系统权限
REVOKE CREATE FROM chenmh;
3.回收用户对象权限,回收zhang用户下person表的所有权限,如果是单个授予的权限需要单个的收回
REVOKE ALL PRIVILEGES ON zhang.person FROM chenmh;
revoke图表:
五、批量操作
1.批量授予权限,授予用户chenmh拥有zhang下所有表的增删改查权限。生产批量执行sql
SELECT 'GRANT SELECT,DELETE,UPDATE,INSERT ON '||OWNER||'.'||TABLE_NAME||' TO CHENMH;' FROM dba_tables WHERE OWNER='ZHANG';
如果要查询其它对象可以查询dba_objects表。
2.批量收回系统权限,收回用户chenmh的所有系统权限
SELECT 'REVOKE '||PRIVILEGE||' FROM CHENMH;' FROM DBA_SYS_PRIVS WHERE GRANTEE='CHENMH';
将拼接的sql复制出来执行查询。
3.批量收回角色权限
SELECT 'REVOKE '||GRANTED_ROLE||' FROM CHENMH;' FROM DBA_ROLE_PRIVS WHERE GRANTEE='CHENMH';
4.批量收回用户对象权限,收回用户chenmh在架构zhang下的所有权限
SELECT 'REVOKE '||PRIVILEGE||' ON '||OWNER||'.'||TABLE_NAME||' FROM CHENMH;' FROM DBA_Tab_Privs WHERE GRANTEE='CHENMH' AND OWNER='ZHANG' ORDER BY TABLE_NAME,PRIVILEGE;
备注:oracle用户的视图权限比较特殊,需要单独授予resource角色不包含创建视图的权限。可以执行
grant create view to chenmh;