GRANT와 REVOKE 는 권한과 관련된 예약어이다.
GRANT 는 권한을 부여할 때 사용하고 REVOKE는 부여된 권한을 뺏을때 사용한다.
예를들어 DBA가 사용자 계정을 생성 할 때 'CREATE USER' 라는 명령어를 사용한다.
하지만 이렇게 생성된 사용자는 DB에 접속하지 못한다. 접속이 가능하게 하려면 'GRANT'명령어로 'CREATE 'SESSION' 권한(Privilege)을 부여하면 그제서야 그 사용자는 디비에 접근이 가능하다.
SYSTEM PRIVILEGE
DBA만 부여 할 수 있는 권한을 SYSTEM PRIVILEGE 라고 한다.
대표적인 SYSTEM PRIVILEGE는 'CREATE SESSION', 'CREATE TABLE', 'CREATE SEQUENCE', 'CREATE VIEW', 'CREATE PROCEDURE' 가 있다.
Role
위의 'TO'의 'role' 은 특정 권한들과 그 권한들을 부여받은 사용자들이라고 할 수 있다.
'Role'은 두가지 용도로 사용할 수 있다.
첫번째로는 사용자에게 권한의 집합(role)을 부여하는 것이다.
두번째로는 'SYSTEM PRIVILEGE' syntex 처럼 'role'을 부여받은 사용자들을 사용자 그룹으로 사용하는 것이다.
OBJECT PRIVILEGE
자신의 스키마에 속해 있는 Object(Table, View, Sequence, Procedure 등)에 대해 타 유저에게 부여하는 권한이다.
GRANT
object_privilege : 객체에 사용가능한 권한(위의 테이블을 참고)
columns : 만약 ON 절의 object 가 Table이나 View일 경우 사용
ON object : Table, View, Sequence, Procedure 등 (위의 테이블을 참고)
TO {user|role|PUBLIC} : 사용자를 일일이 나열할 수도 있고 , role에 소속된 사용자가 될수도 있다. PUBLIC는 모든 사용자라는 뜻
WITH GRANT OPTION : 이 옵션을 사용하면 TO 절의 대상도 자신이 받은 권한을 다른 유저에게 부여할 수 있게 된다.
USER2는 'WITH GRANT OPTION' 으로 권한을 부여받아서 USER3에게 자신이 받은 권한을 부여 가능하다.
이처럼 'WITH GRANT OPTION' 이나 'TO'절에 'PUBLIC' 을 주는 경우는 잘 생각해보고 사용해야 한다. 잘못된 사용은 보안상 치명적이다.
아래 Data Dictionary View를 통해 자신이 타유저에게 허용한 테이블 및 컬럼 권한이나 자신이 타인에게 받은 권한이나 테이블, 컬럼 등을 조회할 수 있다.
출처 :http://www.oracleclub.com/lecture/1009
REVOKE
'REVOKE'는 말 그대로 권한을 뺏는 것을 말한다.
REVOKE는 GRANT 에서 WITH GRANT OPTION으로 받은 권한들을 연쇄적으로 제거한다.
아까 위의 GRANT 에 이어서 보도록 하자.
1. USER1은 USER2에게 부여했던 권한을 제거 할 수 있다.
2. USER2 또한 USER3에게 부여했던 권한을 제거 할 수 있다.
3. 하지만 USER1은 USER3에게 부여된 권한을 제거 할 수 없다.
4. USER1이 USER2의 권한을 제거하면 USER3의 권한도 같이 제거된다.
참고
GRANT 는 권한을 부여할 때 사용하고 REVOKE는 부여된 권한을 뺏을때 사용한다.
예를들어 DBA가 사용자 계정을 생성 할 때 'CREATE USER' 라는 명령어를 사용한다.
하지만 이렇게 생성된 사용자는 DB에 접속하지 못한다. 접속이 가능하게 하려면 'GRANT'명령어로 'CREATE 'SESSION' 권한(Privilege)을 부여하면 그제서야 그 사용자는 디비에 접근이 가능하다.
SYSTEM PRIVILEGE
DBA만 부여 할 수 있는 권한을 SYSTEM PRIVILEGE 라고 한다.
대표적인 SYSTEM PRIVILEGE는 'CREATE SESSION', 'CREATE TABLE', 'CREATE SEQUENCE', 'CREATE VIEW', 'CREATE PROCEDURE' 가 있다.
GRANT privilege [, privilege ...]
TO user [, user.... | role... | PUBLIC];
Role
위의 'TO'의 'role' 은 특정 권한들과 그 권한들을 부여받은 사용자들이라고 할 수 있다.
'Role'은 두가지 용도로 사용할 수 있다.
첫번째로는 사용자에게 권한의 집합(role)을 부여하는 것이다.
두번째로는 'SYSTEM PRIVILEGE' syntex 처럼 'role'을 부여받은 사용자들을 사용자 그룹으로 사용하는 것이다.
1. role 생성
CREATE ROLE role;
2. role에 권한 설정
GRANT privilege [,privilege..
TO role;
3. role 사용자 설정
GRANT role
TO user[, user...]
OBJECT PRIVILEGE
자신의 스키마에 속해 있는 Object(Table, View, Sequence, Procedure 등)에 대해 타 유저에게 부여하는 권한이다.
객체별 권한
GRANT
GRANT object_privilege [(columns)]
ON object
TO {usre|role|PUBLIC}
[WITH GRANT OPTION]
object_privilege : 객체에 사용가능한 권한(위의 테이블을 참고)
columns : 만약 ON 절의 object 가 Table이나 View일 경우 사용
ON object : Table, View, Sequence, Procedure 등 (위의 테이블을 참고)
TO {user|role|PUBLIC} : 사용자를 일일이 나열할 수도 있고 , role에 소속된 사용자가 될수도 있다. PUBLIC는 모든 사용자라는 뜻
WITH GRANT OPTION : 이 옵션을 사용하면 TO 절의 대상도 자신이 받은 권한을 다른 유저에게 부여할 수 있게 된다.
USER2는 'WITH GRANT OPTION' 으로 권한을 부여받아서 USER3에게 자신이 받은 권한을 부여 가능하다.
이처럼 'WITH GRANT OPTION' 이나 'TO'절에 'PUBLIC' 을 주는 경우는 잘 생각해보고 사용해야 한다. 잘못된 사용은 보안상 치명적이다.
아래 Data Dictionary View를 통해 자신이 타유저에게 허용한 테이블 및 컬럼 권한이나 자신이 타인에게 받은 권한이나 테이블, 컬럼 등을 조회할 수 있다.
출처 :http://www.oracleclub.com/lecture/1009
데이터 사전 | 설 명 |
---|---|
USER_TAB_PRIVS | 객체권한의 소유자, 객체권한 부여자, 객체권한 피부여자를 볼수 있음 |
USER_TAB_PRIVS_MADE | 사용자가 부여한 모든 객체권한 |
USER_TAB_PRIVS_RECD | 사용자가 부여받은 모든 객체권한 |
USER_COL_PRIVS | 객체권한의 소유자, 객체권한 부여자, 객체권한 피부여자의 컬럼의 객체권한 |
USER_COL_PRIVS_MADE | 사용자가 부여한 객체 컬럼에 대한 모든 객체권한 |
USER_COL_PRIVS_RECD | 사용자가 부여받은 객체 컬럼에 대한 모든 객체권한 |
REVOKE
'REVOKE'는 말 그대로 권한을 뺏는 것을 말한다.
REVOKE {privilege [, privilege...] | ALL}
ON object
FROM {user[, user...] | role | PUBLIC}
[CASCADE CONSTRAINTS]
아까 위의 GRANT 에 이어서 보도록 하자.
1. USER1은 USER2에게 부여했던 권한을 제거 할 수 있다.
2. USER2 또한 USER3에게 부여했던 권한을 제거 할 수 있다.
3. 하지만 USER1은 USER3에게 부여된 권한을 제거 할 수 없다.
4. USER1이 USER2의 권한을 제거하면 USER3의 권한도 같이 제거된다.
참고
Oracle Database 10g: SQL Fundamentals
'Oracle > Administrator' 카테고리의 다른 글
관리 쿼리 모음 (0) | 2012.03.11 |
---|---|
UNDO 와 Snapshot too old 에러 (0) | 2012.02.26 |
External Tables 외부 테이블 (0) | 2011.09.29 |
Index (0) | 2011.09.29 |
[ORACLE] 도움이 되는 내부테이블(?) (0) | 2011.03.02 |