오라클의 객체 권한은 테이블, 뷰, 시컨스, 시노님 ,,, 즉 계정(소유자) 우선 권한이다. 권한의 부여 및 회수 또한 계정(소유자)의 몫이다.
객체의 권한 종류를 조회할 수 있는 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과 비슷한 개념으로 권한은 같이 회수가 된다.
댓글