본문 바로가기
Oracle/객체 권한

데이터 베이스_ 오라클 [객체 권한] 개요 및 활용

by Super Santj 2019. 7. 4.

오라클의 객체 권한은 테이블, 뷰, 시컨스, 시노님 ,,, 즉 계정(소유자) 우선 권한이다. 권한의 부여 및 회수 또한 계정(소유자)의 몫이다.

객체의 권한 종류를 조회할 수 있는 SQL 은?

시스템권한 -> system_privilege_map

객체 권한 -> table_privilege_map

시스템 계정으로 로그인하여 해당 계정의 객체 권한을 조회해 보자.

SQL> select * from table_privilege_map;

 PRIVILEGE NAME
---------- ----------------------------------------
         0 ALTER
         1 AUDIT
         2 COMMENT    => 주석을 달때 사용(모델링)
         3 DELETE    => 삭제 권한
         4 GRANT    => 권한 부여
         5 INDEX
         6 INSERT    => 테이블에 데이터 생성 권한 
         7 LOCK
         8 RENAME     => 테이블 이름 변경 또는 필드 이름 변경 권한
         9 SELECT     => 테이블의 select 부여
        10 UPDATE     => 수정하는 권한

 PRIVILEGE NAME
---------- ----------------------------------------
        11 REFERENCES
        12 EXECUTE     => (실행) 권한
        16 CREATE     => 생성
        17 READ
        18 WRITE
        20 ENQUEUE
        21 DEQUEUE
        22 UNDER
        23 ON COMMIT REFRESH
        24 QUERY REWRITE
        26 DEBUG

 PRIVILEGE NAME
---------- ----------------------------------------
        27 FLASHBACK       => 데이터 복구 관련 명령어, 다른말로는 flashback 기술
        28 MERGE VIEW
        29 USE
        30 FLASHBACK ARCHIVE

26 개의 행이 선택되었습니다.

권한을 줄때엔 테이블(DML=insert,update,delete)(DQL=select)과 뷰(execute), 함수, 프로시저에 집중적(권한부여 포커스)으로 주게된다.

하나의 객체 권한 시나리오를 구상해본다면 _

test2,test3,test4 에게 scott 소유의 b_dept2 테이블의 권한을 부여 하려한다.

참고 형식 ) grant 권한 종류,,, on 적용 대상자(=테이블 or =뷰,,,) to 계정명,,,,[with grant option] <=  위임옵션

해설_

시스템 계정 로그인후, 각 계정을 생성해 준후 권한을 부여해준다.

SQL> conn sys/sys12345 as sysdba
연결되었습니다.
SQL> create user test2 identified by test2;

사용자가 생성되었습니다.

SQL> create user test3 identified by tes3;

사용자가 생성되었습니다.

SQL> create user test4 identified by tes4;

사용자가 생성되었습니다.

SQL> grant create session,create table to test2, test3, test4;

권한이 부여되었습니다.

여기까지는 시스템 계정의 역할인것이고, 실질적으로 b_dept2 테이블의 권한은 scott 계정에서 권한을 부여해줘야 하기에 scott 계정으로 로그인후 각 3개 계정에 권한을 부여해주면된다.

test2 에게는 insert 권한을, test3 에게는 b_dept2 테이블에 관한 모든 권한을 위임(with grant option)할 예정이고, test4 에게는 select와 update 권한을 부여할것이다. 하지만 우리는 여기서 문제는 좀더 꼬아서, scott은 test3 에게만 모든 권한을 위임한후, test3가 나머지 scott이 할일을 대신하여 test2 에게는 insert 권한을 부여하고, test4 에게는 update와 select 권한을 부여해보자.

위 내용의 결과 및 과정은 아래와 같다.

SQL> conn scott/tiger
연결되었습니다.

SQL> grant select,insert,update on b_dept2 to test3 with grant option;

권한이 부여되었습니다.

SQL> conn test3/tes3      => test3 계정으로 로그인
연결되었습니다.

SQL> grant insert on scott.b_dept2 to test2;     => test2 에게 insert 권한을 부여

권한이 부여되었습니다.

SQL> grant update,select on scott.b_dept2 to test4;      => test4 에게 update 및 select 권한을 부여

권한이 부여되었습니다.

그리고 권한이 잘 부여가 되었는지 test4 계정으로 로그인하여 scott소유의 b_dept2 테이블을 호출해보자.

SQL> conn test4/tes4
연결되었습니다.
SQL> select * from scott.b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        SEOUL
        70 TESTING2       BUSAN
        80 TESTING3       TESTLOC

8 개의 행이 선택되었습니다.

마지막으로 한번 test4 계정이 갖고있는 update 구문을 이용, 60번 부서의 loc 데이터를 DALLAS로 변경해본다면 아래와 같다.

SQL> update scott.b_dept2 set loc='DALLAS' where deptno=60;

1 행이 갱신되었습니다.

SQL> select * from scott.b_dept2;

    DEPTNO DNAME          LOC
---------- -------------- -------------
        10 ACCOUNTING     NEW YORK
        20 RESEARCH       DALLAS
        30 SALES          CHICAGO
        40 OPERATIONS     BOSTON
        50 SUPPORT        KWANGJU
        60 TESTING        DALLAS
        70 TESTING2       BUSAN
        80 TESTING3       TESTLOC

8 개의 행이 선택되었습니다.

마지막 문제_

만약 스캇 계정이 TEST3에게 부여한 권한을 회수한다면, TEST3에게 권한을 양도받은 TEST2, TEST4의 권한은 어떻게 되는것인가를 확인해 보자, 결과는 아래와 같다.

SQL> conn scott/tiger
연결되었습니다.
SQL> revoke select,insert,update on b_dept2 from test3;

권한이 취소되었습니다.

SQL> conn test4/tes4
연결되었습니다.
SQL> select * from scott.b_dept2;
select * from scott.b_dept2
                    *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

소유자(scott)가 test3(select,insert,update) -> test4라는 계정에게 부여받은 권한의 일부(select, update)를 줘도 자기 권한(test3)을 회수당하면 양도한 계정 (test4)도 같이 회수를 당한다.

 위 구문을 토대로 보았을때 객체권한은 Role과 비슷한 개념으로 권한은 같이 회수가 된다.

댓글