Describe 권한과역할 here {{{ SQL> SET PAGESIZE 200 LINESIZE 200 SQL> SHOW USER USER은 "SYSTEM"입니다 SQL> DROP USER TEST; 사용자가 삭제되었습니다. SQL> CREATE USER TEST IDENTIFIED BY TEST 2 DEFAULT TABLESPACE USERS 3 TEMPORARY TABLESPACE TEMP; 사용자가 생성되었습니다. SQL> GRANT CREATE SESSTION, CREATE TABLE 2 TO TEST; GRANT CREATE SESSTION, CREATE TABLE * 1행에 오류: ORA-00990: 권한이 부적합합니다 SQL> GRANT CREATE SESSION, CREATE TABLE 2 TO TEST; 권한이 부여되었습니다. SQL> CONNECT TEST/TEST 연결되었습니다. SQL> CREATE TABLE TEST_TABLE 2 (ID NUMBER); CREATE TABLE TEST_TABLE * 1행에 오류: ORA-01950: 테이블 영역 'USERS'에 대한 권한이 없읍 SQL> 분명히 CREATE TABLE 권한이 주어져 있음에도 불구하고 테이블을 생성하지 못하는 것을 볼 수 있습니다. 이것은 사용자 생성당시 해당 디폴트 테이블스페이스에 대한 QUOTA를 설정해 주지 않아서 그런 것입니다.. SQL> CONN SYSTEM/MANAGER 연결되었습니다. SQL> ALTER USER TEST 2 QUOTA 1M ON USERS; 사용자가 변경되었습니다. SQL> CREATE TABLE TEST_TABLE 2 (ID NUMBER); 테이블이 생성되었습니다. SQL> 대충 이런 과정을 거쳐서 기본적인 사용자 생성을 하였습니다..여기서는 권한에 대해서 좀 더 살펴보도록 하겠습니다. 권한에는 시스템 권한과 객체 권한이 있습니다. 객체 권한은 해당 객체에 대한 사용할 수 있는가에 대한 것이고, 시스템 권한은 데이타베이스 시스템에 관련된 것입니다. 우리가 위에서 한 것들은 모두 시스템 권한에 대한 것이였습니다..오라클 객체라는 것은 테이블, 인덱스, 클러스터, 시노님 같은 것을 말합니다..시스템 권한은 일반적으로 DBA 권한 을 가진 사람이 다른 사용자에게 권한을 줍니다..정책에 따라서 다르지만요.. 먼저 권한을 주는 GRANT 문의 문법을 살펴보도록 하겠습니다. grant::= GRANT { grant_system_privileges | grant_object_privileges } ; grant_system_privileges::= { system_privilege | role | ALL PRIVILEGES } [, { system_privilege | role | ALL PRIVILEGES }]... TO grantee_clause [IDENTIFIED BY password] [WITH ADMIN OPTION] grant_object_privileges::= { object_privilege | ALL [PRIVILEGES] } [( column [, column]... )] [, { object_privilege | ALL [PRIVILEGES] } [( column [, column]... )]]... on_object_clause TO grantee_clause [WITH GRANT OPTION] [WITH HIERARCHY OPTION] grantee_clause::= { user | role | PUBLIC } [, { user | role | PUBLIC }]... 시스템 권한에 대한 문법에 WITH ADMIN OPTION 이 있습니다. 그리고..맨 마지막에 PUBLIC이란 키워드도 보이는군요..ROLE에 대한 것은 조금 있다가 하구요.. 일단 PUBLIC 이란 키워드는 모든 사용자에게 권한을 주는 것을 의미하는 것입니다. 즉, USER 명을 넣어주는 대신에 PUBLIC 키워드를 사용하여 모든 사용자를 나타내는 것입니다. WITH ADMIN OPTION이 있는데 이것은 권한을 상속할 수 있는 권한이 됩니다. 해보도록 하지요.. SQL> CONN SYSTEM/MANAGER 연결되었습니다. SQL> GRANT CREATE SESSION TO PUBLIC; -- 모든 사용자에게 CREATE SESSION 권한을 준다. 권한이 부여되었습니다. SQL> GRANT CREATE TABLE TO TEST2; 권한이 부여되었습니다. SQL> GRANT CREATE VIEW TO TEST 2 WITH ADMIN OPTION; -- WITH ADMIN OPTION을 사용해서 권한 설정 권한이 부여되었습니다. SQL> CREATE USER TEST2 IDENTIFIED BY TEST2 --TEST2 사용자 생성 2 DEFAULT TABLESPACE USERS 3 QUOTA 1M ON USERS; CREATE USER TEST2 IDENTIFIED BY TEST2 * 1행에 오류: ORA-01920: 사용자명 'TEST2'(이)가 다른 사용자나 롤 이름과 상충됩니다 SQL> DROP USER TEST2 CASCADE; 사용자가 삭제되었습니다. SQL> CREATE USER TEST2 IDENTIFIED BY TEST2 --TEST2 사용자 생성 2 DEFAULT TABLESPACE USERS 3 QUOTA 1M ON USERS; 사용자가 생성되었습니다. SQL> CONNECT TEST2/TEST2 -- 바로 세션을 열수가 있다.. 연결되었습니다. SQL> CONNECT TEST/TEST 연결되었습니다. SQL> CREATE VIEW V_TEST_TABLE 2 AS 3 SELECT * FROM TEST_TABLE; 뷰가 생성되었습니다. SQL> CONN TEST/TEST 연결되었습니다. SQL> GRANT CREATE VIEW TO TEST2; -- WITH ADMIN OPTION으로 권한을 설정 --> 권한 상속가능 권한이 부여되었습니다. SQL> CONNECT TEST2/TEST2 연결되었습니다. SQL> CREATE TABLE TEST(ID NUMBER); 테이블이 생성되었습니다. SQL> CREATE VIEW V_TEST -- TEST2 사용자로 뷰 생성 가능하다.. 2 AS 3 SELECT * FROM TEST; 뷰가 생성되었습니다. SQL> CONN SYSTEM/MANAGER 연결되었습니다. SQL> CREATE USER TEST3 IDENTIFIED BY TEST3 --TEST3 사용자 생성 2 DEFAULT TABLESPACE USERS 3 QUOTA 1M ON USERS; 사용자가 생성되었습니다. SQL> GRANT CREATE TABLE TO TEST3; 권한이 부여되었습니다. SQL> CONN TEST2/TEST2 연결되었습니다. SQL> GRANT CREATE VIEW TO TEST3; -- TEST2 사용자는 권한을 줄수가 없다. GRANT CREATE VIEW TO TEST3 * 1행에 오류: ORA-01031: 권한이 불충분합니다 SQL> CONN TEST/TEST 연결되었습니다. SQL> GRANT CREATE VIEW TO TEST2 2 WITH ADMIN OPTION; 권한이 부여되었습니다. SQL> CONNECT TEST2/TEST2 연결되었습니다. SQL> GRANT CREATE VIEW TO TEST3; 권한이 부여되었습니다. SQL> CONNECT TEST3/TEST3 연결되었습니다. SQL> CREATE TABLE TEST(ID NUMBER); 테이블이 생성되었습니다. SQL> CREATE VIEW V_TEST 2 AS 3 SELECT * FROM TEST; 뷰가 생성되었습니다. SQL> 권한의 삭제는 REVOKE 문을 사용해서 할 수 있습니다. 다음은 전체 문법입니다.. 문법이 전체 문법이라서 그렇지...실제로 사용할때는 그에 맞추어 사용하기만 하면됩니다..개뿔도 아님돠.. revoke::= REVOKE { revoke_system_privileges | revoke_object_privileges } [, { revoke_system_privileges | revoke_object_privileges } ]... ; revoke_system_privileges::= { system_privilege | role | ALL PRIVILEGES } [, { system_privilege | role | ALL PRIVILEGES }]... FROM grantee_clause revoke_object_privileges::= { object_privilege | ALL [PRIVILEGES] } [( column [, column]... )] [, { object_privilege | ALL [PRIVILEGES] } [( column [, column]... )]]... on_object_clause FROM grantee_clause [CASCADE CONSTRAINTS] [FORCE] grantee_clause::= { user | role | PUBLIC } [, { user | role | PUBLIC }]... on_object_clause::= { schema . object | { DIRECTORY directory_name | JAVA { SOURCE | RESOURCE } [schema .] object } } 앞에서 TEST, TEST2, TEST3 사용자를 생성했었는데...중간에 있는 TEST3사용자에 대한 CREAT VIEW 권한을 지워보겠습니다...그러면 TEST3 사용자는 CREATE VIEW문을 사용할 수 있는지 살펴보시기 바랍니다.. SQL> CONN TEST/TEST 연결되었습니다. SQL> REVOKE CREATE VIEW FROM TEST2; 권한이 취소되었습니다. SQL> CONN TEST2/TEST2 연결되었습니다. SQL> CREATE VIEW V2 2 AS 3 SELECT ID FROM TEST_TABLE; SELECT ID FROM TEST_TABLE * 3행에 오류: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다 SQL> SELECT * FROM TAB; TNAME TABTYPE CLUSTERID ------------------------------------------------------------ -------------- ---------- TEST TABLE V_TEST VIEW SQL> CREATE VIEW V_TEST2 2 AS 3 SELECT ID FROM TEST; CREATE VIEW V_TEST2 * 1행에 오류: ORA-01031: 권한이 불충분합니다 SQL> CONNECT TEST3/TEST3 연결되었습니다. SQL> CREATE VIEW V_TEST2 2 AS 3 SELECT ID FROM TEST; 뷰가 생성되었습니다. 객체 권한에 대한 것을 살펴보도록 하겠습니다..일단 객체권한을 주는 것은 다음과 같습니다. 무작정 해보는 것이 좋겠죠...헐헐~ SQL> CONN TEST/TEST 연결되었습니다. SQL> CREATE TABLE OBJ_TEST 2 (OBJ VARCHAR2(10)); 테이블이 생성되었습니다. SQL> GRANT SELECT ON OBJ_TEST TO TEST2 2 WITH GRANT OPTION; -- TEST2 사용자에게는 WITH GRANT OPTION 을 사용했다.. 권한이 부여되었습니다. SQL> -- TEST2 사용자로 접속하여 TEST3 사용자에게 TEST 사용자의 OBJ_TEST 테이블을 SQL> -- SELECT 할 수 있는 권한을 준다. SQL> CONNECT TEST2/TEST2 연결되었습니다. SQL> SELECT * FROM TEST.OBJ_TEST; 선택된 레코드가 없습니다. SQL> GRANT SELECT ON TEST.OBJ_TEST TO TEST3 2 ; 권한이 부여되었습니다. SQL> CONN TEST3/TEST3 연결되었습니다. SQL> SELECT * FROM OBJ_TEST; SELECT * FROM OBJ_TEST * 1행에 오류: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다 SQL> SELECT * FROM TEST.OBJ_TEST; 선택된 레코드가 없습니다. SQL> CONN TEST/TEST 연결되었습니다. SQL> -- TEST2 사용자의 TEST 사용자의 OBJ_TEST에 대한 SELECT 권한을 취소한다. SQL> REVOKE SELECT ON OBJ_TEST FROM TEST2; 권한이 취소되었습니다. SQL> CONN TEST3/TEST3 연결되었습니다. SQL> -- 권한을 취소한건 TEST2 사용자인데 TEST3 사용자까지도 접근이 불가능해 졌다.. SQL> SELECT * FROM TEST.OBJ_TEST; SELECT * FROM TEST.OBJ_TEST * 1행에 오류: ORA-00942: 테이블 또는 뷰가 존재하지 않습니다 SQL> INSERT, UPDATE, DELETE 에 대한 권한도 마찬가지 입니다.. 좀더 복잡한 예제는 다음과 같이 될 수 있습니다. GRANT REFERENCES (employee_id), UPDATE (employee_id, salary, commission_pct) ON hr.employees TO oe; WITH ADMIN OPTION 과 WITH GRANT OPTION의 차이를 아셨을 것입니다. 즉, WITH ADMIN OPTION 은 권한이 연쇄적으로 취소되지 않으나 WITH GRANT OPTION 은 연쇄적으로 취소가되는 것을 볼 수 있습니다. 이러한 이유는 무엇일까요? WITH ADMIN OPTION 으로 권한을 주는 것에 대한 족보는 오라클 데이타 사전에 기록되지 않으나 WITH GRANT OPTION 으로 권한을 준 족보는 오라클 데이타 사전에 기록되기 때문입니다.. SQL> COL GRANTOR FORMAT A15 SQL> COL GRANTEE FORMAT A15 SQL> COL TABLE_NAME FORMAT A15 SQL> CONNECT TEST/TEST 연결되었습니다. SQL> GRANT SELECT ON OBJ_TEST TO TEST2; 권한이 부여되었습니다. SQL> SELECT GRANTOR, GRANTEE, TABLE_NAME, PRIVILEGE 2 FROM ALL_TAB_PRIVS 3 WHERE TABLE_NAME = 'OBJ_TEST'; GRANTOR GRANTEE TABLE_NAME PRIVILEGE --------------- --------------- --------------- ------------------------------ TEST TEST2 OBJ_TEST SELECT SQL> SELECT * FROM DBA_SYS_PRIVS 2 WHERE GRANTEE = 'TEST'; GRANTEE PRIVILEGE ADMIN_ --------------- ------------------------------ ------ TEST CREATE VIEW YES TEST CREATE TABLE NO TEST CREATE SESSION NO SQL> 아촤촤~ 까묵을뻔 봤슴다..롤에 대한 것을 안했군요...롤..이미 살펴봤지요.. CONNECT, RESOURCE 롤이 있는거.. 롤은 아시다시피 권한의 묶음 입니다...귀찮게 CREATE SESSION, CREATE TABLE, 테이블에 대한 SELECT 권한 등과 같이 일일이 다 줄라면 힘들죠.. 또한 각각의 사용자 별로 비슷한 업무를 수행하는 그룹으로 나누어 각각의 그룹에 롤을 이용해서 권한을 부여하는 것이 효과적인 관리 방법이죠.. 물론...프로파일도 각각의 그룹마다 틀리게 만들어주구요.. 다음은 롤을 만든 문법입니다.. CREATE ROLE role [ NOT IDENTIFIED | IDENTIFIED { BY password | USING [schema .] package | EXTERNALLY | GLOBALLY } ] ; 간단합니다...사용자 생성에서와 같이 그 롤을 사용하려면 패스워드도 설정해 줄 수 있 구요.. SQL> CONNECT SYSTEM/MANAGER 연결되었습니다. SQL> CREATE ROLE TEST_ROLE; 롤이 생성되었습니다. SQL> GRANT CREATE SESSION, CREATE TABLE TO TEST_ROLE; 권한이 부여되었습니다. SQL> GRANT SELECT, UPDATE, INSERT ON TEST.OBJ_TEST TO TEST_ROLE; 권한이 부여되었습니다. SQL> GRANT TEST_ROLE TO TEST; 권한이 부여되었습니다. SQL> SELECT * FROM DBA_SYS_PRIVS 2 WHERE GRANTEE = 'TEST'; GRANTEE PRIVILEGE ADMIN_ --------------- ------------------------------ ------ TEST CREATE VIEW YES TEST CREATE TABLE NO TEST CREATE SESSION NO SQL> CONNECT TEST/TEST 연결되었습니다. SQL> SELECT GRANTOR, GRANTEE, TABLE_NAME, PRIVILEGE 2 FROM ALL_TAB_PRIVS 3 WHERE TABLE_NAME = 'OBJ_TEST'; GRANTOR GRANTEE TABLE_NAME PRIVILEGE --------------- --------------- --------------- ------------------------------ TEST TEST2 OBJ_TEST DELETE TEST TEST2 OBJ_TEST SELECT TEST TEST_ROLE OBJ_TEST INSERT TEST TEST_ROLE OBJ_TEST SELECT TEST TEST_ROLE OBJ_TEST UPDATE SQL> 사실..이런거는 책보고 해보면 금방할 수 있는 것입니다..중요한 것은 어떻게 각각의 사용자를 분류하여 어떤 권한을 줄 것인가가 중요한 것입니다. 이러한 것은 사용방법에 속하는 것이고...몇번 키보두 두들겨 보면 알 수 있는 것입니다... 중요한 것이 무엇인지를 생각하고 보시길... }}}