2012. 7. 9. 18:52

1. Role의 장점
   - grant 횟수를 줄일 수 있다.
   - 동적인 privilege 관리가 가능하다.
   - privilege를 enable, disable 할 수 있다.
   - OS를 통해서 grant를 줄 수 있다.
   - cascade revoke가 필요 없다.
   - performance 를 증가 시킨다.
   
2. Role을 만들어서 사용하는 절차

   1) role을 만든다.
   2) privilege 를 role에 grant 한다.
   3) role을 user에게 grant 한다.
   
3. CREATE ROLE

   SQL> CREATE ROLE sales_clerk ;
   
   SQL> CREATE ROLE hr_clerk
     2  IDENTIFIED BY bonus ;
   --> role을 enable 할 때, password를 bonus로 입력하게 한다.
     
   SQL> CREATE ROLE hr_manager
     2  IDENTIFIED EXTERNAL ;
   --> user의 OS 정보를 보고 확인한다.
     
   * role은 만들어지면 자동 enable 된다.
   
4. 오라클에 기본적으로 미리 생성된 roles

   CONNECT
   RESOURCE
   DBA : WITH ADMIN OPTION을 포함한 모든 system 권한을 주낟.
   EXP_FULL_DATABASE : DB export 권한을 준다.
   IMP_FULL_DATABASE : DB import 권한을 준다.
   DELETE_CATALOG_ROLE : data dictionary table의 delete 권한을 준다.
   EXECUTE_CATALOG_ROLE : data dictionary package의 execute 권한을 준다.
   SELECT_CATALOG_ROLE : data dictionary table의 select 권한을 준다.
   
5. ALTER ROLE

   SQL> ALTER ROLE sales_clerk
     2  IDENTIFIED BY commission ;
   --> role에 commission 이라는 password를 걸어 준다.
     
   SQL> ALTER ROLE hr_clerk
     2  IDENTIFIED EXTERNALLY ;
   --> user의 OS 정보를 체크하게 한다.
     
   SQL> ALTER ROLE hr_manager
     2  NOT IDENTIFIED ;
   --> role에 걸려있는 password 없애기
   
6. Role assign 하기

   SQL> GRANT sales_clerk TO scott ;
   --> scott에게 sales_clerk role을 부여한다.
   
   SQL> GRANT hr_clerk TO hr_manager ;
   --> hr_manager role에 hr_clerk role을 부여한다.
   
   SQL> GRANT hr_manager TO scott
     2  WITH ADMIN OPTION ;
   --> scott 에게 hr_manager role을 부여하면서 다른 사람에게 이 role을 줄 권한도 준다.
   
7. DEFAULT ROLE
   - 접속했을때 enable할 role을 지정한다.
   - dba 권한이다.
   - ALTER USER 할때만 가능하다.
   
   SQL> ALTER USER scott
     2  DEFAULT ROLE hr_clerk, sales_clerk ;
   --> 현재 갖고 있는 role 중에서 hr_clerk, sales_clerk role만 enable 시킨다.
   
   SQL> ALTER USER scott DEFAULT ROLE ALL ;
   --> 부여된 모든 role을 enable 시킨다.
   
   SQL> ALTER USER scott DEFAULT ROLE ALL
     2  EXCEPT hr_clerk ;
   --> hr_clerk role을 제외한 모든 role을 enable 시킨다.
   
   SQL> ALTER USER scott DEFAULT ROLE NONE ;
   --> 부여된 모든 role을 disable 시킨다.
   
8. 현재 접속한 user가 자신의 role을 enable 만들기

   SQL> SET ROLE sales_clerk
     2  IDENTIFIED BY commission ;
   --> sales_clerk에 commission이라는 password를 체크하고, enable 시킨다.
     
   SQL> SET ROLE hr_clerk ;
   --> 부여된 role 중에 hr_clerk만 enable 시킨다.
   
   SQL> SET ROLE ALL EXCEPT sales_clerk ;
   --> 부여된 role 중에서 sales_clerk 를 제외한 모든 role을 enable 시킨다.
   
   SQL> SET ROLE NONE ;
   --> 부여된 모든 role을 disable 시킨다.
   
   SQL> SET ROLE ALL ;
   --> 부여된 모든 role을 enable 시킨다.
   
9. ROLL 권한 빼앗기

   SQL> REVOKE sales_clerk FROM scott ;
   --> scott에게 있는 sales_clerk role을 제거한다.
   
   SQL> REVOKE hr_manager FROM PUBLIC ;
   --> 모든 user에게서 hr_manager role의 권한을 없앤다.
   
   [syntax]
   REVOKE role [,role]...
      FROM {user | role | PUBLIC}
           [, {user | role | PUBLIC} ]...
           
10. ROLE 제거하기

    DROP ROLE hr_manager ;
    
11. Role 정보를 갖고 있는 data dictionary

    DBA_ROLES : All roles which exist in the database
    DBA_ROLE_PRIVS : Roles granted to users and roles
    ROLE_ROLE_PRIVS : Roles which are granted to roles
    DBA_SYS_PRIVS : System privileges granted to users and roles
    ROLE_SYS_PRIVS : System privileges granted to roles
    ROLE_TAB_PRIVS : Table privileges granted to roles
    SESSION_ROLES : Roles which the user currently has enabled
    
    SVRMGR> SELECT role, password_required
         2  FROM dba_roles ;



[ Lab ]

1. RESOUCE role에 부여되어 있는 시스템 권한을 나열하십시오.
$ sqlplus system/manager
SQL> select * from dba_sys_privs where grantee='RESOURCE' ;

2. Role을 생성하여, user에게 default role로 부여해 보십시오.
SQL> connect system/manager
SQL> grant create table, create view to dev ;

SQL> connect scott/tiger
SQL> grant select on emp to dev ;

SQL> connect system/manager
SQL> grant dev, resource to bob ;
SQL> select * from dba_role_privs
  2  where grantee='BOB' ;
  
SQL> alter user bob default role resoure ;
SQL> connect bob/oracle
SQL> select * from session_roles ;
SQL> select * from scott.emp ;      ==> error 발생 확인!!!
SQL> set role all ;
SQL> select * from session_roles ;
SQL> select * from scott.emp ;

Posted by 몰라욧