联系:手机/微信(+86 17813235971) QQ(107644445)
作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任的权利.]
今天在pub上看到一个问题,一个朋友想回收dba的alter system权限,直接回收这个系统权限从dba的做法是不推荐使用,因为修改了系统默认的dba角色所具有的系统权限,可能会导致未知的后果。好的做法是创建新的角色,使其有dba中除alter system之外的所有权限。
1、数据库版本
SQL> select * from v$version; BANNER ------------------------------------------------------------------------- Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production PL/SQL Release 11.2.0.1.0 - Production CORE 11.2.0.1.0 Production TNS for 32-bit Windows: Version 11.2.0.1.0 - Production NLSRTL Version 11.2.0.1.0 - Production
2、创建角色并授权
SQL> create role xifenfei; 角色已创建。 SQL> declare 2 cursor cur is select privilege from role_sys_privs where role='DBA' 3 AND PRIVILEGE NOT IN ('ALTER SYSTEM','ADMINISTER RESOURCE MANAGER'); 4 BEGIN 5 FOR C in cur loop 6 EXECUTE IMMEDIATE 'grant '||c.privilege||' to xifenfei'; 7 END loop; 8 END; 9 / PL/SQL 过程已成功完成。 SQL> SELECT PRIVILEGE FROM ROLE_SYS_PRIVS 2 WHERE ROLE ='DBA' AND PRIVILEGE NOT IN( 3 SELECT PRIVILEGE FROM ROLE_SYS_PRIVS 4 WHERE ROLE ='XIFENFEI' 5 ); PRIVILEGE ---------------------------------------- ALTER SYSTEM ADMINISTER RESOURCE MANAGER
说明:授予创建角色出ALTER SYSTEM和ADMINISTER RESOURCE MANAGER系统权限之外的所有权限
3、创建用户并授权角色
SQL> create user chf_xff identified by xifenfei; 用户已创建。 SQL> grant xifenfei to chf_xff; 授权成功。
4、单独授予ADMINISTER RESOURCE MANAGER权限
SQL> exec dbms_resource_manager_privs.grant_system_privilege( 2 grantee_name => 'CHF_XFF',admin_option => false); PL/SQL 过程已成功完成。 SQL> CONN chf_xff/xifenfei 已连接。 SQL> SELECT * FROM SESSION_PRIVS WHERE 2 PRIVILEGE ='ADMINISTER RESOURCE MANAGER'; PRIVILEGE ---------------------------------------- ADMINISTER RESOURCE MANAGER
说明:
1)通过授权xifenfei角色和ADMINISTER RESOURCE MANAGER权限,完成回收dba中的alter system权限要求。
2)如果只有个别用户有这样的需求,那么可以直接生成批量授权语句实现,而不用建立类此xifenfei这样的角色。
5、为何单独授予ADMINISTER RESOURCE MANAGER权限
SQL> CONN / AS SYSDBA 已连接。 SQL> GRANT ADMINISTER RESOURCE MANAGER TO CHF_XFF; GRANT ADMINISTER RESOURCE MANAGER TO CHF_XFF * 第 1 行出现错误: ORA-00990: 权限缺失或无效
说明:ADMINISTER RESOURCE MANAGER这个系统权限在10g及其以后版本中,就不能直接使用GRANT/REVOKE直接授权/回收权限,而必面使用dbms_resource_manager_privs.grant_system_privilege和revoke_system_privilege过程进行处理。