Oracle SQL 강좌
객체 권한(Object Privileges) 46 35 99,999+

by 김정식 객체 권한 OBJECT PRIVILEGES GRANT REVOKE WITH GRANT OPTION USER_TAB_PRIVS [2002.01.19]


객체권한은 USER가 소유하고 있는 특정 객체를 다른 사용자들이 엑세스 하거나 조작 할 수 있게 하기 위해 생성 한다.

객체권한(Object Privileges) 이란?

  • - 테이블이나 뷰, 시퀀스, 프로시저, 함수, 또는 패키지 중 지정된 한 객체에 특별한 작업을 수행 할 수 있게 한다.
  • - 객체 소유자는 다른 사용자에게 특정 객체권한을 부여 할 수 있다.
  • - PUBLIC으로 권한을 부여하면 회수할 때도 PUBLIC으로 해야 한다.
  • - 기본적으로 소유한 객체에 대해서는 모든 권한이 자동적으로 획득된다.
  • - WITH GRANT OPTION 옵션은 ROLE에 권한을 부여할 때는 사용할 수 없다.

객체에 따른 권한 목록 예

객체권한 테이블 시퀀스 프로시저
ALTER
DELETE
EXECUTE
INDEX
INSERT
SELECT

객체권한 부여 문법

위의 표에서 맨 왼쪽에 있는 ALTER, DELETE, EXECUTE.. 등등은 object_privilege란에 오면 되고, 맨 윗줄에 있는 테이블, 뷰, 시퀀스, 프로시저 등등은 ON 다음에 있는 object에 입력하면 된다.

객체권한 부여 문법

  • - object_privilege : 부여할 객체권한의 이름
  • - object : 객체명
  • - user, role : 부여할 사용자 이름과 다른 데이터 베이스 역할 이름
  • - PUBLIC : 객체권한, 또는 데이터베이스 역할을 모든 사용자에게 부여할 수 있다.
  • - WITH GRANT OPTION : 권한을 부여 받은 사용자도 부여 받은 권한을 다른 사용자 또는 역할로 부여할 수 있게 된다.

객체권한 부여 예제

	
-- scott USER에게 emp테이블을 SELECT, INSERT할 수 있는 권한을 부여했다.
-- scott USER도 다른 USER에게 그 권한을 부여 할 수 있다.
SQL>GRANT SELECT, INSERT
    ON emp
    TO scott
    WITH  GRANT  OPTION;
 권한이 부여되었습니다.
	

객체권한의 회수

시스템 권한의 회수문법

  • - 객체 권한의 철회는 그 권한을 부여한 부여자만이 수행할수 있다.
  • - CASCADE CONSTRAINTS : 이 명령어의 사용으로 참조 객체 권한에서 사용 된 참조 무결성 제한을 같이 삭제 할 수 있다.
  • - WITH GRANT OPTION으로 객체 권한을 부여한 사용자의 객체 권한을 철회하면, 권한을 부여받은 사용자가 부여한 객체 권한 또한 같이 철회되는 종속철회가 발생한다.

객체권한 회수 예제

 
-- scott USER에게 부여한 emp 테이블에 대한 SELECT, INSERT 권한 회수 예제
-- 만약 scott USER가 다른 사용자에게 SELECT, INSERT권한을 부여했으면
     그 권한들도 같이 회수가 된다.
SQL>REVOKE SELECT, INSERT
    ON emp
    FROM scott;
 권한이 회수되었습니다.
	

WITH GRANT OPTION을 사용하여 객체권한 회수

WITH GRANT OPTION을 사용하여 부여한 객체 권한을 취소하면 취소 작업이 연쇄적으로 수행 된다.

시나리오
  • 1. SCOTT가 STORM에게 WITH GRANT OPTION을 사용하여 emp 테이블의 SELECT 권한을 부여 한다.
  • 2. STORM이 emp 테이블의 SELECT 권한을 TEST에게 부여 한다.
  • 3. SCOTT가 STORM에게 부여한 emp 테이블의 SELECT 권한을 취소 한다.

시스템 권한의 회수

결과
  • - SCOTT가 STORM에게 부여한 emp 테이블에 대한 SELECT 권한을 취소하면, TEST USER가 emp 테이블을 SELECT할 수 있는 권한도 자동으로 취소가 된다.

시스템 권한의 회수

객체권한관련 데이터 사전

데이터 사전 설 명
USER_TAB_PRIVS 객체권한의 소유자, 객체권한 부여자, 객체권한 피부여자를 볼수 있음
USER_TAB_PRIVS_MADE 사용자가 부여한 모든 객체권한
USER_TAB_PRIVS_RECD 사용자가 부여받은 모든 객체권한
USER_COL_PRIVS 객체권한의 소유자, 객체권한 부여자, 객체권한 피부여자의 컬럼의 객체권한
USER_COL_PRIVS_MADE 사용자가 부여한 객체 컬럼에 대한 모든 객체권한
USER_COL_PRIVS_RECD 사용자가 부여받은 객체 컬럼에 대한 모든 객체권한

- 강좌 URL : http://www.gurubee.net/lecture/1009

- 구루비 강좌는 개인의 학습용으로만 사용 할 수 있으며, 다른 웹 페이지에 게재할 경우에는 출처를 꼭 밝혀 주시면 고맙겠습니다.~^^

- 구루비 강좌는 서비스 제공을 위한 목적이나, 학원 홍보, 수익을 얻기 위한 용도로 사용 할 수 없습니다.

by 배명진 [2004.10.27 16:16:42]
설명이 잘못된듯 싶네요 ..!

Storm이 Scott에게 권한을 부여하고 스콧이 객체를 생성하지만

스톰에게 권한이 삭제되면 스콧또한 권한이 연쇄삭제 되는거 맞죠 ^^

by 수 [2004.10.31 23:31:17]
Storm 이 Scott 에게 권한을 부여한후엔.. Strom 권한이 삭제되더라도 Scott은 권한이 그대로 남아 있습니다.

by 방기홍 [2005.01.09 03:21:18]
그러면, 시스템 권한과 객체 권한의 취소는 다른 결과를 만드는 건가요?

by 허승철 [2005.03.21 12:23:49]
이거 어떤게 맞는건가요..

제가 생각하기에는 설명이 틀린거 같은대..^^;

여기서는 with grant option을 사용해서 지울때 이렇게 된다는게 아닌가요..?

만약에 with grant option를 사용하지 않고 지울때는 권한이 자기 객체만 되는거 아닌가요..??

벌써부터 막히내요..ㅠㅠ

by 이성복 [2005.03.21 12:25:12]
storm 권한이 삭제 되면 scott 권한 또한 삭제가 된다는 말 아닌가여?

잘 몰라서..^^

by 손세용 [2005.04.07 11:10:15]
revoke문에서는 with grant option을 사용하지 못하는걸로 알고 있습니다.
그리고 위의 내용이 맞는것 같은데요..

with grant option을 사용하여 storm에거 부여된 권한을 storm이 scott에게 부여했다면 storm이 with grant option으로 받은 권한이 제거되면 storm이 scott에게 부여한 권한이 같이 제거 됩니다.
storm과 scott의 권한이 같이 제거 되죠..

제 생각은 이렇습니다..^^;

by 방문자 [2005.05.26 15:48:32]
무슨 말인지 모르겠당...ㅠ.ㅠ

by 박세영 [2005.07.20 14:27:51]
오타가 있는듯..

by 그누세상 [2005.10.15 03:35:07]
잘 읽었습니다.^^

by LinDol [2005.10.25 20:56:36]
잘읽었습니다. :)

by 정성철 [2005.10.26 15:54:54]
시스템권한의 경우는 연쇄해제가 안되고, 객체권한의 경우에는 연쇄해제가 된다는 얘기지요? 윗분들이 한분빼고 이상한 말씀들을 하시니깐....ㅋㅋ

by smile [2005.11.09 20:37:27]
퍼갑니다. ^^

by DISCO [2005.11.14 01:16:47]
음..권한을 부여할때 with grant option를 넣지않고 권한을 부여했으면
권한을 해제할때도 SCOTT만 해제되고 시스템권한과 동일하고....
with grant option넣었을경우 SCOTT이 부여한 객체권한도 사라진다는 말...인듯.

by 쥐약 [2006.01.19 01:17:21]
with grant option을 넣지 않고 storm에게 권한을 부여하면 storm은 scott에게 권한을 부여할 수 없음. 그러니 해제하면 당연히 storm의 권한만 해제됨.

by 이동형 [2006.06.21 18:07:55]
며칠전 오라클 입문한 생초짜입니다...
첫번째 예제를 실행하니 테이블 또는 뷰가 존재하지 않는다고 나오는군요
그래서 SCOTT으로 다시 접속하여 TABLE_NAME을 보니 EMP가 분명히 있거든요
도대체 무슨 문제인지 누가 아시는 분은 좀 가르쳐 주시기 바랍니다...

by 개떵이 [2006.08.01 13:36:13]
혼자 공부할래구 다 퍼갑니다.

by 엽 [2006.09.18 17:32:49]
저도 이동형님과 같은 질문 입니다.
왜 그런가요 ?

by 황소 [2006.10.04 15:54:38]
위에 이동형님과 같은 문제로 고심하다가...ㅋ
저도 몇일전 임문한 생초짜라 전문적 용어는 말씀 못드리겠고...
system 이나 sys 로 접속하여 해보십시오...
권한문제인가 ㅠ_ㅠ;; 왜이리 나만 어렵게 느껴지지...

by 난나야 [2006.11.28 15:49:10]
scott 은 다른사용자에게 권한을 줄수 있는 with grant option을 가지고 있지 않기 때문에 그렇게 나오는거 같군요.

by 노바소닉 [2007.01.23 13:42:33]
권한부여 예제 잘못된거 같아요.,.system유저의 테이블이 없는 상황에서 권한을 줄수 없기에 안되는거 같은데요...이건 꼭 맞다곤 못하고 제 느낌상...
그리고...설명은 다른분들 말씀되로 넘 자세히 잘되어 있는거 같아요..감사합니다..

by begin [2007.09.22 17:51:00]
이동형님 저도 시작한지는 얼마되지 않았지만
제 생각을 얘기해 보겠습니다.

첫번째 예제는 어떤 사용자가 scott사용자에게
emp테이블을 select,insert할수 있는 권한을 주는 것입니다.
즉, scott사용자가 emp테이블을 가지고 있어야한다는 의미가 아니라
어떤사용자가 가지고 있는 emp테이블에 대한 select, insert하는 권한을
scott사용자에게 부여하는거네요.

여기서 어떤 사용자는 꼭 system사용자가 아니어도 됩니다.
이말은..
시스템권한은 system사용자만이 다른 사용자에게 권한을 부여할 수 있지만
객체권한은 system사용자가 아닌 사용자도 다른 사용자에게 권한을 부여할수있다는 말입니다.

제가 정리한 것이 맞는진 모르겠지만 도움이 되셨으면 좋겠습니다.

<< 좋은 자료 덕분에 도움 많이 받으며 공부하고 있습니다. 고맙습니다. >>




by 김윤경 [2007.10.24 17:31:42]
많은 도움 됐어요.

by 김은준 [2008.01.03 12:09:01]
위의 내용을 테스트 해보았습니다.

[테스트 결과]
객체의 권한은 객체(emp)의 OWNER(storm)가 부여할 수 있습니다.
객체의 권한을 with grant option과 함께 부여하면,
권한을 부여받은 user(scott)는 부여받은 권한에 대해서 다른 user(ex1)에게
그 권한을 부여할 수 있습니다.
OWNER(storm)가 부여한 권한을 user(scott)로부터 회수하면,
user(scott)가 부여한 다른 user(ex1)의 권한도 함께 회수됩니다.

[데이터 조회 방법]
데이터를 조회 할 경우,
객체를 OWNER(storm)가 조회하듯이 객체이름(emp)으로 조회하면
아래와 같은 결과를 얻게 됩니다.

SQL> select * from emp;
select * from emp
*
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

객체(emp)의 OWNER(storm)를 제외한 나머지 user(scott, ex1)는
객체이름을 OWNER(storm).객체(emp)로 해야만 조회할 수 있습니다.

SQL> select * from storm.emp;

NAME SALGRADE
-------------------- ----------
KEJ 6500

by 그놈 [2008.03.10 21:12:12]
실습을해보시길. 난 대략 알겠는데 ㅋㅋㅋ

by 퐁민이 [2008.07.14 08:45:36]
강좌하나하나 재밌게 공부하고 있습니다.
어느 책보다 훌륭하네요....^-^

by 베트맨 [2008.07.24 14:19:11]
storm에게 scott이 권한을 받았을경우 그냥 철회하면 scott권한은 그대로 남아있고 CASCADE CONSTRAINTS옵션을 적용하면 scott에게 부여된 권한도 같이 철회된다는 말..

by 슈퍼맨 [2008.07.24 15:34:37]
scott이 가지고 있는table에 대한 select,insert권한을 with grant option으로 test01 유저에게 부여하고 test01유저가 다시 test02 유저에게 부여했을경우
scott이 select권한을 cascade constraints옵션을 사용하지 않고 회수했다면 test02는 select 권한을 가지고 있지만 privs에는 나타나지 않는데....어케 확인하죠.?

by 윤영모 [2010.06.25 13:20:47]
ㅇ ㅏ 나 여기강의 너무너무 좋아요 완전 머리에 쏙쏙 들어오고

by 김창환 [2010.10.08 18:31:08]
잘보고갑니다.

by scott [2011.11.02 10:18:37]
이거인듯요
grant select, insert
on scott.emp <<<emp가아니라...scott이란 계정에 emp테이블을 지정해야하는듯
to scott
with grant option;

by 돌이맹이 [2012.02.23 16:43:20]
쉽게 설명 잘 되어 있네요^^

by 용현 [2012.02.28 12:31:32]
제가 테스트 해 본 결과입니다.


C:\>sqlplus "/as sysdba"

SQL*Plus: Release 11.2.0.1.0 Production on 화 2월 28 11:48:43 2012

Copyright (c) 1982, 2010, Oracle. All rights reserved.


다음에 접속됨:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

SQL> show user
USER은 "SYS"입니다
SQL> create user test1 identified by test;

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

SQL> create user test2 identified by test;

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

SQL> create user test3 identified by test;

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

SQL> grant connect, resource, create table to test1,test2,test3;

권한이 부여되었습니다.

SQL> conn test1/test;
연결되었습니다.
SQL> create table test_table
2 ( col1 varchar2(5));

테이블이 생성되었습니다.

SQL> grant select on test_table to test2 with grant option;

권한이 부여되었습니다.

SQL> conn test2/test
연결되었습니다.
SQL> select * from test1.test_table;

선택된 레코드가 없습니다.

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


SQL> conn test2/test
연결되었습니다.
SQL> grant select on test1.test_table to test3;

권한이 부여되었습니다.

SQL> conn test3/test
연결되었습니다.
SQL> select * from test1.test_table;

선택된 레코드가 없습니다.

SQL> show user
USER은 "TEST3"입니다
SQL> conn test1/test
연결되었습니다.
SQL> revoke select on test_table from test2;

권한이 취소되었습니다.

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


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

--------------------------------------------------------

실험한 결과 연쇄 삭제 맞는 것 같습니다. ^^;

by 손님 [2013.01.10 14:20:09]

머리가 나빠서 힘들게 이해하고 다음장으로 ~ ㅎ


by 손님 [2013.05.06 20:11:05]

으그흐그


by 신화씨앤씨 [2013.10.22 17:42:38]

많은 도움 됐어요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입