ORACLE 9i PRIVILEGES
from
1. 권한의 전파
A. 환경
i. U1, U2USER를 생성하였고 DEFAULT TABLESPACE ,TEMPORARY TABLESPACE 를
지정한상태이다.
B. WITHADMIN OPTION
SQL> show user
USER is "SYS"
SQL> grant create session to u1 withadmin option;
Grant succeeded.
SQL> conn u1/u1;
Connected.
SQL> grant create session to u2 withadmin option;
Grant succeeded.
(SYSTEM 권한에는 WITH ADMIN OPTION을사용한다.)
SQL> conn u2/u2;
Connected.
SQL> conn /as sysdba
Connected.
SQL> revoke create session from u1;
Revoke succeeded.
SQL> conn u2/u2;
Connected.
SQL> conn /as sysdba
Connected.
(U1으로부터 CREATE SESSION 권한을 빼앗아도 U2에 부여된 권한은 남아있다.)
C. WITH GRANT OPTION
SQL> grant select on scott.emp to u1 withadmin option;
grant select on scott.emp to u1 with adminoption
*
ERROR at line 1:
ORA-00993: missing GRANT keyword
(객체권한에 with admin option 을 사용하면 에러가 난다.)
SQL> grant select on scott.emp to u1 withgrant option;
Grant succeeded.
SQL> conn u1/u1
Connected.
SQL> grant select on scott.emp to u2 withgrant option;
Grant succeeded.
SQL> show user
USER is "U1"
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
SQL> conn u2/u2
Connected.
SQL> select count(*) from scott.emp;
COUNT(*)
----------
14
(U1, U2 모두 부여한 객체에 접근가능함을 확인했다.)
SQL> conn /as sysdba;
Connected.
SQL> revoke select on scott.emp from u1;
Revoke succeeded.
SQL> conn u1/u1
Connected.
SQL> select count(*) from scott.emp;
select count(*) from scott.emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> conn u2/u2
Connected.
SQL> select count(*) from scott.emp;
select count(*) from scott.emp
*
ERROR at line 1:
ORA-00942: table or view does not exist
2. ROLE 이 가지고있는 권한의 확인
A. HR USER를 SAMPLE 로 진행하겠다.
B. 특정 USER 가 가지고 있는 ROLE 의 확인
SQL> desc dba_role_privs;
Name Null? Type
------------------------------------------------- ----------------------------
GRANTEE VARCHAR2(30)
GRANTED_ROLE NOT NULLVARCHAR2(30)
ADMIN_OPTION VARCHAR2(3)
DEFAULT_ROLE VARCHAR2(3)
SQL> select grantee,granted_role
2 from dba_role_privs
3 where grantee = 'HR';
GRANTEE GRANTED_ROLE
------------------------------ ------------------------------
HR CONNECT
HR RESOURCE
(확인결과 HR 유저는 CONNECT 와 RESOURCE 를 ROLE 로 가지고 있다.)
C. 해당 ROLE 에 귀속되어있는 PRIVILEGE 의 확인
SQL> select role,privilege
2 from role_sys_privs
3 where role in ('CONNECT','RESOURCE');
ROLE PRIVILEGE
----------------------------------------------------------------------
CONNECT CREATE VIEW
CONNECT CREATE TABLE
CONNECT ALTER SESSION
CONNECT CREATE CLUSTER
CONNECT CREATE SESSION
CONNECT CREATE SYNONYM
CONNECT CREATE SEQUENCE
CONNECT CREATE DATABASE LINK
RESOURCE CREATE TYPE
RESOURCE CREATE TABLE
RESOURCE CREATE CLUSTER
ROLE PRIVILEGE
----------------------------------------------------------------------
RESOURCE CREATE TRIGGER
RESOURCE CREATE OPERATOR
RESOURCE CREATE SEQUENCE
RESOURCE CREATE INDEXTYPE
RESOURCE CREATE PROCEDURE
16 rows selected.
위의 결과를 확인 한 결과
CONNECT – CREATE VIEW, CREATE TABLE, ALTERSESSION, CREATE CLUSTER,
CREATE SESSION, CREATE SYNONYM, CREATESEQUENCE, CREATE DATABASE LINK 가 존재하는 걸 확인하였고
RESOURCE – CREATE TYPE, CREATE TABLE, CREATECLUSTER, CREATE TRIGGER, CREATE OPERATOR, CREATE SEQUENCE, CREATE INDEXTYPE,CREATE PROCEDURE 가 있는 걸 확인하였다.
Beginning Oracle 책을 보면 RESOURCE ROLE 에 UNLIMITED TABLESPACE 시스템권한이 있기 때문에 가급적 사용하지 않는 것이 좋다고 한다. 위에서 확인한 결과에서는 위의 권한을 볼수 없다. 위 쿼리를 사용한 오라클 버전은 9.2.0.4.0 이다. ( 버전업되면서 사라진 듯 하다 )
D. 특정 유저가 가진 롤과 권한을 확인하는쿼리 ( 위의과정을 합친 쿼리이다. )
SQL> !cat f_user_role.sql
select role,privilege from role_sys_privs
where role in ( select granted_role fromdba_role_privs
where grantee like upper('%&USER_NAME%'));
/