콘텐츠로 이동

GRANT

GRANT#

구문#

grant ::=#

grant_image171

grant_system_privilege ::=#

grant_system_privilege

grant_object_privilege ::=#

grant_object_privilege

전제 조건#

SYS 사용자와 GRANT ANY PRIVILEGES 시스템 권한을 가진 사용자만이 시스템 권한을 부여할 수 있다. 또한 객체 권한은 객체의 소유자이거나 WITH GRANT OPTION으로 객체 권한을 부여받은 사용자만이 그 객체에 대한 권한을 다른 사용자에게 부여할 수 있다.

SYS 사용자와 GRANT ANY ROLE 시스템 권한을 가진 사용자만이 롤(role)에 시스템 권한을 부여할 수 있다.

설명#

명시된 사용자에게 데이터베이스와 객체에 접근하기 위한 권한들을 부여하는 구문이다.

권한은 시스템 권한과 객체 권한으로 분류된다.

grant_system_privilege#

시스템 권한은 일반적으로 SYS 사용자에 의해 관리된다. SYS 사용자는 사용자들에게 특정 데이터베이스 작업을 수행하는 것을 허용하기 위해서 제한된 시스템 권한을 부여할 수 있다. 시스템 권한은 모든 스키마에 있는 객체들을 제어하는 광범위한 권한으로 볼 수 있다.

시스템 권한은 DDL문과 DCL문을 수행하기 위해서 필요하다.

system_privilege#

부여될 시스템 접근 권한의 이름을 명시한다.

role#

부여될 롤의 이름을 명시한다.

  • 롤(role)은 다른 role이나 PUBLIC에게 부여할 수 없다.

  • 한 사용자에게 롤을 최대 126개까지 부여할 수 있다.

  • 사용자에게 롤을 부여해도 사용자에게 바로 적용되는 것이 아니다. 사용자가 데이터베이스에 다시 접속(connect)한 후에 롤의 권한이 적용된다.

ALL PRIVILEGES#

모든 시스템 권한을 사용자에게 부여하기 위해 사용되는 옵션이다.

TO user#

시스템 권한을 부여할 사용자 이름을 명시한다.

TO role#

시스템 권한을 부여할 롤(role)의 이름을 명시한다.

TO PUBLIC#

모든 사용자에게 시스템 권한을 부여함을 명시하는 옵션이다.

주의 사항#
  • SYS 사용자와 GRANT ANY PRIVILEGES 권한을 가진 사용자는 모든 시스템 권한을 다른 사용자에게 부여할 수 있다.
  • SYS 사용자는 모든 시스템 권한을 가진다.
  • 시스템 권한 중 ANY 키워드는 모든 스키마에 대한 권한을 가진다. 예를 들어 SELECT ANY TABLE 권한은 데이터베이스 내에 있는 모든 테이블을 SELECT 할 수 있다.
  • CREATE 권한은 객체를 생성할 수 있는 권한이며, 해당 객체를 삭제하는 권한도 포함한다.
  • CREATE TABLE 객체 권한은 테이블 뿐만 아니라 인덱스를 생성하는 권한을 포함한다. 이 인덱스 생성 권한은 시스템 권한이 아니라 객체 권한이다.
  • 새로운 사용자가 생성될 때 기본적으로 CREATE MATERIALIZED VIEW, CREATE LIBRARY, CREATE SESSION, CREATE TABLE, CREATE SEQUENCE, CREATE SYNONYM, CREATE PROCEDURE, CREATE VIEW, CREATE TRIGGER, 그리고 CREATE DATABASE LINK 권한이 그 사용자에게 부여된다.

다음 쿼리를 사용하면 Altibase가 지원하는 모든 시스템 권한들의 목록을 볼 수 있다.

iSQL> SELECT * FROM SYSTEM_.SYS_PRIVILEGES_ where PRIV_TYPE = 2;

Altibase는 다음과 같은 시스템 접근 권한을 지원한다.

PrivID System privilege Name Purpose
1 ALL 사용자에게 모든 시스템 권한을 부여한다. 단, 이 권한을 사용자에게 부여해도 ALTER DATABASE, DROP DATABASE, MANAGER TABLESPACE 권한은 부여되지 않는다.
201 DATABASE ALTER SYSTEM Altibase 프로퍼티 설정을 동적으로 변경할 수 있다.
233 ALTER DATABASE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다.
234 DROP DATABASE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다.
202 INDEX CREATE ANY INDEX 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 인덱스 생성이 가능하다.
203 ALTER ANY INDEX 데이터베이스에 존재하는 모든 인덱스의 정의를 변경할 수 있다.
204 DROP ANY INDEX 데이터베이스에 존재하는 모든 인덱스를 삭제할 수 있다.
205 PROCEDURE CREATE PROCEDURE 자신의 스키마 내에 저장 프로시저나 함수를 생성할 수 있다.
206 CREATE ANY PROCEDURE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에 저장 프로시저나 함수를 생성할 수 있다.
207 ALTER ANY PROCEDURE 데이터베이스에 존재하는 모든 저장 프로시저나 함수를 재컴파일 할 수 있다.
208 DROP ANY PROCEDURE 데이터베이스에 존재하는 모든 저장 프로시저나 함수를 삭제할 수 있다.
209 EXECUTE ANY PROCEDURE 데이터베이스에 존재하는 모든 저장 프로시저나 함수를 실행할 수 있다.
210 SEQUENCE CREATE SEQUENCE 자신의 스키마 내에 시퀀스를 생성할 수 있다.
211 CREATE ANY SEQUENCE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 시퀀스 생성이 가능하다.
212 ALTER ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스의 정의를 변경할 수 있다.
213 DROP ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스를 삭제할 수 있다.
214 SELECT ANY SEQUENCE 데이터베이스에 존재하는 모든 시퀀스를 조회할 수 있다.
215 SESSION CREATE SESSION 서버에 연결할 수 있다.
216 ALTER SESSION 자동으로 모든 사용자에게 부여된다.
217 TABLE CREATE TABLE 자신의 스키마 내에 테이블을 생성할 수 있다.
218 CREATE ANY TABLE 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 테이블 생성이 가능하다.
219 ALTER ANY TABLE 데이터베이스에 존재하는 모든 테이블에 대해서 truncate(모든 레코드 삭제)하거나 모든 테이블의 정의를 변경할 수 있다.
220 DELETE ANY TABLE 데이터베이스에 존재하는 모든 테이블의 레코드를 삭제 할 수 있다.
221 DROP ANY TABLE 데이터베이스에 존재하는 모든 테이블을 삭제할 수 있다.
222 INSERT ANY TABLE 데이터베이스에 존재하는 모든 테이블에 새로운 레코드를 삽입할 수 있다.
223 LOCK ANY TABLE 데이터베이스에 존재하는 모든 테이블에 테이블 잠금을 할 수 있다.
224 SELECT ANY TABLE 데이터베이스에 존재하는 모든 테이블의 데이터를 조회할 수 있다.
225 UPDATE ANY TABLE 데이터베이스에 존재하는 모든 테이블의 데이터를 변경할 수 있다.
226 USER CREATE USER 새로운 사용자를 생성할 수 있다.
227 ALTER USER 모든 사용자의 암호를 변경할 수 있다.
228 DROP USER 사용자를 제거할 수 있다.
229 VIEW CREATE VIEW 자신의 스키마 내에 뷰를 생성할 수 있다.
230 CREATE ANY VIEW 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 뷰 생성이 가능하다.
231 DROP ANY VIEW 데이터베이스에 존재하는 모든 뷰를 삭제 할 수 있다.
232 MISCELLANEOUS GRANT ANY PRIVILEGES 모든 시스템 권한을 다른 사용자에게 부여할 수 있다.
235 TABLESPACES CREATE TABLESPACE 테이블스페이스를 생성할 수 있다.
236 ALTER TABLESPACE 테이블스페이스 정의를 변경할 수 있다.
237 DROP TABLESPACE 테이블스페이스를 삭제할 수 있다.
238 MANAGE TABLESPACE SYS 사용자 외의 다른 사용자에게는 부여되지 않는다.
240 SYSDBA SYS 사용자 외의 다른 사용자에게는 부여되지 않는다.
241 TRIGGER CREATE TRIGGER 자신의 스키마 내에 새로운 트리거를 생성할 수 있다.
242 CREATE ANY TRIGGER 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 트리거 생성이 가능하다.
243 ALTER ANY TRIGGER 데이터베이스에 존재하는 모든 트리거의 정의를 변경할 수 있다.
244 DROP ANY TRIGGER 데이터베이스에 존재하는 모든 트리거를 제거할 수 있다.
245 SYNONYM CREATE SYNONYM 자기 소유의 시노님 (private synonym)을 생성할 수 있다.
246 CREATE PUBLIC SYNONYM PUBLIC 시노님을 생성할 수 있다.
247 CREATE ANY SYNONYM 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 PRIVATE 시노님을 생성할 수 있다.
248 DROP ANY SYNONYM PRIVATE 시노님을 삭제할 수 있다.
249 DROP PUBLIC SYNONYM PUBLIC 시노님을 삭제할 수 있다.
250 DIRECTORY CREATE ANY DIRECTORY 저장프로시저 내에서 파일 제어를 위해 사용되는 디렉토리 객체를 생성할 수 있다.
251 DROP ANY DIRECTORY 디렉토리 객체를 삭제할 수 있다.
252 MATERIALIZED VIEW CREATE MATERIALIZED VIEW 자신의 스키마 내에 새로운 MATERIALIZED VIEW를 생성할 수 있다.
253 CREATE ANY MATERIALIZED VIEW 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에 MATERIALIZED VIEW를 생성할 수 있다.
254 ALTER ANY MATERIALIZED VIEW 데이터베이스에 존재하는 모든 MATERIALIZED VIEW를 변경할 수 있다.
255 DROP ANY MATERIALIZED VIEW 데이터베이스에 존재하는 모든 MATERIALIZED VIEW를 삭제 할 수 있다.
256 LIBRARY CREATE LIBRARY 자신의 스키마 내에 새로운 라이브러리 객체를 생성할 수 있다.
257 CREATE ANY LIBRARY 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서도 라이브러리 객체 생성이 가능하다.
258 ALTER ANY LIBRARY 데이터베이스에 존재하는 모든 라이브러리 객체를 컴파일할 수 있다.
259 DROP ANY LIBRARY 데이터베이스에 존재하는 모든 라이브러리 객체를 제거할 수 있다.
260 DATABASE LINK CREATE DATABASE LINK 새로운 데이터베이스 링크를 생성할 수 있다.
261 CREATE PUBLIC_DATABASE LINK PUBLIC 데이터베이스 링크를 생성할 수 있다.
262 DROP PUBLIC DATABASE LINK PUBLIC 데이터베이스 링크를 삭제할 수 있다.
263 ROLE CREATE ROLE 새로운 롤을 생성할 수 있다.
264 DROP ANY ROLE 데이터베이스에 존재하는 모든 롤을 삭제할 수 있다.
265 GRANT ANY ROLE 모든 롤을 다른 사용자에게 부여할 수 있다.
266 JOB CREATE ANY JOB 자신의 스키마 뿐 아니라 다른 사용자의 스키마 내에서 새로운 JOB을 생성할 수 있다.
268 ALTER ANY JOB 데이터베이스에 존재하는 모든 JOB을 변경할 수 있다.
267 DROP ANY JOB 데이터베이스에 존재하는 모든 JOB을 삭제할 수 있다.

grant_object_privilege#

사용자가 특정 객체에 대한 권한을 부여 받으면, 사용자는 객체를 접근 및 조작할 수 있다. 객체 접근 권한은 일반적으로 객체 소유자에 의해 관리된다.

시스템 권한이 없으면, DML문을 수행을 위해서 객체 권한이 필요하다.

object_privilege#

어떤 객체에 대한 특정 권한만을 부여하고자 할 때 사용되는 절이다. (이 절의 아래에 어떤 객체에 대해서 어떤 권한이 지원되는지를 보여주는 표가 있다.)

ALL PRIVILEGES#

객체에 대한 모든 가능한 권한을 부여하는 옵션이다.

ON object#

어느 객체에 대해서 권한을 부여할 것인지를 명시하는 절이다. 객체에는 테이블, 시퀀스, 저장 프로시저가 있다.

ON DIRECTORY directory_name#

권한을 부여할 대상인 저장 프로시저 내에서 사용하는 디렉토리 객체의 이름을 명시한다.

TO user#

객체에 대한 객체 권한을 부여 받는 사용자를 명시한다.

TO PUBLIC#

모든 사용자에게 객체 권한을 부여한다.

TO role#

객체 권한을 부여할 롤(role)의 이름을 명시한다.

WITH GRANT OPTION#

권한 수여자가 다른 사용자들에게 자신이 받은 객체 권한을 부여할 수 있는 옵션이다. 단 롤에 객체 권한을 부여할 때는 WITH GRANT OPTION을 사용할 수 없다.

주의 사항#
  • 객체의 소유자란 객체를 생성한 사용자로서, 해당 객체에 대한 모든 객체 권한을 가진다.

  • 객체 권한은 객체의 소유자이거나, WITH GRANT OPTION으로 객체 권한을 부여받은 사용자만이 그 객체에 대한 권한을 다른 사용자에게 부여할 수 있다.

  • SYS 사용자가 객체 권한을 부여받지 못하였다면, 권한은 SYS로써 한정될 뿐 다른 사용자에게 권한을 부여할 수 없다.

다음 쿼리로 Altibase에서 지원하는 모든 객체 권한들에 대한 정보를 볼 수 있다.

SELECT * FROM SYSTEM_.SYS_PRIVILEGES_ where PRIV_TYPE = 1;

Altibase는 다음과 같은 객체 접근 권한을 지원한다.

Priv ID Object privileges Table Sequence PSM/ External Procedure View directory External Library
101 ALTER O O
102 DELETE O
103 EXECUTE O O
104 INDEX O
105 INSERT O
106 REFERENCES O
107 SELECT O O O
108 UPDATE O
109 READ O
110 WRITE O

모든 사용자는 자동으로 메타 테이블에 대한 SELECT 권한을 가진다.

예제 1: 사용자에게 시스템 권한 부여#

<질의1> 다음은 사용자 user5에게 EXECUTE ANY PROCEDURE, SELECT ANY TABLE, ALTER ANY SEQUENCE, INSERT ANY TABLE, SELECT ANY SEQUENCE 등의 시스템 권한을 부여하는 예제이다.

iSQL> CREATE TABLE seqtbl(i1 INTEGER);
Create success.
iSQL> CREATE OR REPLACE PROCEDURE proc1
AS
BEGIN
  FOR i IN 1 .. 10 LOOP
    INSERT INTO seqtbl VALUES(i);
  END LOOP;
END;
/
Create success.

iSQL> CREATE USER uare5 IDENTIFIED BY rose5;
Create success.
iSQL> GRANT EXECUTE ANY PROCEDURE, SELECT ANY TABLE TO uare5;
Grant success.
iSQL> CONNECT uare5/rose5;
Connect success.
iSQL> EXEC sys.proc1;
Execute success.
iSQL> SELECT * FROM sys.seqtbl;
SEQTBL.I1   
--------------
1           
2           
3           
4           
5           
6           
7           
8           
9           
10          
10 rows selected.

iSQL> CONNECT sys/manager;
Connect success.
iSQL> CREATE SEQUENCE seq1
  START WITH 13
  INCREMENT BY 3
  MINVALUE 0 NOMAXVALUE;
Create success.
iSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL);
1 row inserted.
iSQL> INSERT INTO seqtbl VALUES(seq1.NEXTVAL);
1 row inserted.
iSQL> SELECT * FROM seqtbl;
SEQTBL.I1   
--------------
1           
2           
3           
4           
5           
6           
7           
8           
9           
10          
13          
16          
12 rows selected.

iSQL> GRANT ALTER ANY SEQUENCE, INSERT ANY TABLE, SELECT ANY SEQUENCE TO uare5;
Grant success.
iSQL> CONNECT uare5/rose5;
Connect success.    
iSQL> ALTER SEQUENCE sys.seq1
  INCREMENT BY 50
  MAXVALUE 100
  CYCLE;
Alter success.

iSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL);
1 row inserted.
iSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL);
1 row inserted.
iSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL);
1 row inserted.
iSQL> INSERT INTO sys.seqtbl VALUES(sys.seq1.NEXTVAL);
1 row inserted.
iSQL> SELECT * FROM sys.seqtbl;
SEQTBL.I1   
--------------
1           
2           
3           
4           
5           
6           
7           
8           
9           
10          
13          
16          
66          
0           
50          
100         
16 rows selected.

예제 2: 롤에 시스템 권한 부여#

<질의 2> 이름이 alti_role인 롤을 생성한 후, 롤에게 create user와 drop user 등의 시스템 권한을 부여한다.

iSQL> create role alti_role;
Create success.
iSQL> grant create user, drop user to alti_role;
Grant success.
iSQL> create user user01 identified by user01;
Create success.
iSQL> grant alti_role to user01;
Grant success.
iSQL> connect user01/user01
Connect success.
iSQL> create user user02 identified by user02;
Create success.
iSQL> drop user user02;
Drop success.

예제 3: WITH GRANT OPTION으로 객체 권한 부여 예제#

<질의 3> 사용자 uare6가 WITH GRANT OPTION으로 employees 테이블에 대한 SELECT와 DELETE 객체 권한을 부여 받은 후, 같은 권한을 다른 사용자 uare7과 uare8에게 부여한다.

iSQL> CREATE USER uare6 IDENTIFIED BY rose6;
Create success.
iSQL> GRANT CREATE USER TO uare6;
Grant success.
iSQL> @ ?/sample/APRE/schema/schema

iSQL> CONNECT sys/manager;
Connect success.
iSQL> GRANT SELECT, DELETE ON employees TO uare6 WITH GRANT OPTION;
Grant success.
iSQL> CONNECT uare6/rose6;
Connect success.
iSQL> CREATE USER uare7 IDENTIFIED BY rose7;
Create success.
iSQL> GRANT SELECT, DELETE ON sys.employees TO uare7;
Grant success.
iSQL> CONNECT uare7/rose7;
Connect success.
iSQL> DELETE FROM SYS.employees WHERE eno = 12;
1 row deleted.
iSQL> SELECT eno, e_lastname FROM sys.employees WHERE eno = 12;
ENO         E_LASTNAME                 
-------------------------------------
No rows selected.
iSQL> CONNECT sys/manager;
Connect success.
iSQL> CREATE USER uare8 IDENTIFIED BY rose8;
Create success.
iSQL> CONNECT uare6/rose6;
Connect success.
iSQL> GRANT SELECT, DELETE ON sys.employees TO uare8;
Grant success.

WITH GRANT OPTION 으로 객체권한을 부여받은 사용자 uare6는 자신이 생성한 사용자 uare7 뿐만 아니라 원래의 권한 부여자(SYS)가 생성한 사용자 uare8에게도 객체 권한을 부여할 수 있다.

iSQL> CONNECT uare8/rose8;
Connect success.
iSQL> DELETE FROM sys.employees WHERE eno = 13;
1 row deleted.

iSQL> SELECT eno, e_lastname FROM sys.employees WHERE eno = 13;
ENO         E_LASTNAME                 
-------------------------------------
No rows selected.

예제 4: WITH GRANT OPTION으로 시스템 권한 및 객체 권한 부여 예제#

<질의 4> 다음은 사용자에게 시스템 권한, 객체 권한을 부여한 후 각각의 권한을 해제하는 예제이다.

1) SYS 사용자가 uare9에게 모든 시스템 권한을 부여한다.

iSQL> CONNECT sys/manager;
Connect success.
iSQL> CREATE TABLE book(
  isbn CHAR(10) PRIMARY KEY,
  title VARCHAR(50),
  author VARCHAR(30),
  edition INTEGER DEFAULT 1,
  publishingyear INTEGER,
  price NUMBER(10,2),
  pubcode CHAR(4));
Create success.
iSQL> CREATE TABLE inventory(
  subscriptionid CHAR(10) PRIMARY KEY,
  storecode CHAR(4),
  purchasedate DATE,
  quantity INTEGER,
  paid CHAR(1));
Create success.

iSQL> CREATE USER uare9 IDENTIFIED BY rose9;
Create success.
iSQL> GRANT ALL PRIVILEGES TO uare9;
Grant success.

2) SYS는 사용자 uare9에게 객체 book에 대한 REFERENCES 권한을 WITH GRANT OPTION 으로 부여한다.

iSQL> GRANT REFERENCES ON book TO uare9 WITH GRANT OPTION;
Grant success.
- 사용자 uare9은 SYS로부터 객체 book에 대한 REFERENCES 권한을 WITH GRANT OPTION 으로 부여 받았기 때문에, uare9은 다른 사용자(uare10)에게 객체 book에 대해 REFERENCES 객체 권한을 부여할 수 있다.

3) uare9이 SYS의 객체인 book 테이블과 inventory 테이블에 데이터를 입력한다.

iSQL> CONNECT uare9/rose9;
Connect success.

iSQL> INSERT INTO sys.book VALUES ('0070521824', 'Software Engineering', 'Roger S. Pressman', 4, 1982, 100000, 'CHAU');
1 row inserted.
iSQL> INSERT INTO sys.book VALUES ('0137378424', 'Database Processing', 'David M. Kroenke', 6, 1972, 80000, 'PREN');
1 row inserted.

iSQL> INSERT INTO sys.inventory VALUES('BORD000002', 'BORD', '12-Jun-2003', 6, 'N');
1 row inserted.
iSQL> INSERT INTO sys.inventory VALUES('MICR000001', 'MICR', '07-Jun-2003', 7, 'N');
1 row inserted.

4) uare9이 SYS의 객체인 book 테이블과 inventory 테이블을을 조회한다.

iSQL> SELECT * FROM sys.book;
ISBN                  TITLE                 AUTHOR                EDITION     PUBLISHINGYEAR PRICE       PUBCODE               
---------------------------------------------------------------------------------------------------------------------------------------
0070521824            Software Engineering  Roger S. Pressman     4           1982        100000      CHAU                  
0137378424            Database Processing   David M. Kroenke      6           1972        80000       PREN                  
2 rows selected.

iSQL> SELECT * FROM sys.inventory;
SUBSCRIPTIONID        STORECODE             PURCHASEDATE QUANTITY    PAID                  
-------------------------------------------------------------------------------------------------
BORD000002            BORD                  12-JUN-2003  6           N                     
MICR000001            MICR                  07-JUN-2003  7           N                     
2 rows selected.

iSQL> CREATE TABLE book(
  isbn CHAR(10) PRIMARY KEY,
  title VARCHAR(50),
  author VARCHAR(30),
  edition INTEGER DEFAULT 1,
  publishingyear INTEGER,
  price NUMBER(10,2),
  pubcode CHAR(4));
Create success.

iSQL> CREATE TABLE inventory(
  subscriptionid CHAR(10) PRIMARY KEY,
  isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES book(isbn), 
  storecode CHAR(4),
  purchasedate DATE,
  quantity INTEGER,
  paid CHAR(1));
Create success.

5) uare9은 SYS로부터 ALL PRIVILEGES를 부여 받았으므로 다른 사용자를 생성할 수 있다.

iSQL> CREATE USER uare10 IDENTIFIED BY rose10;
Create success.

6) SYS는 uare9에게 REFERENCES 권한을 WITH GRANT OPTION으로 부여했기 때문에, uare9는 다른 사용자(uare10)에게 이 권한을 부여할 수 있다.

iSQL> GRANT REFERENCES ON sys.book TO uare10;
Grant success.

7) GRANT ANY PRIVILEGES를 부여 받은 uare9이 다른 사용자(uare10)에게 시스템 권한을 부여한다.

iSQL> GRANT ALTER ANY TABLE, INSERT ANY TABLE, SELECT ANY TABLE, DELETE ANY
TABLE TO uare10;
Grant success.

8) 사용자 uare10은 ALTER ANY TABLE과 REFERENCE 권한이 있기 때문에, 다른 사용자 소유의 테이블에 제약조건을 추가할 수 있다.

iSQL> CONNECT uare10/rose10;
Connect success.
iSQL> ALTER TABLE sys.inventory
      ADD COLUMN (isbn CHAR(10) CONSTRAINT fk_isbn REFERENCES sys.book(isbn));
Alter success.

9) 사용자 uare10은 INSERT ANY TABLE 권한이 있기 때문에, 사용자 uare9가 소유한 테이블에 데이터를 입력할 수 있다.

iSQL> INSERT INTO uare9.book VALUES('0471316156', 'JAVA and CORBA', 'Robert Orfali', 2, 1998, 50000, 'PREN');
1 row inserted.
iSQL> INSERT INTO uare9.inventory VALUES('TOWE000001', '0471316156', 'TOWE', '01-Jun-2003', 5, 'N');
1 row inserted.

사용자 uare10은 INSERT ANY TABLE 권한이 있기 때문에, SYS소유의 테이블에 데이터를 입력할 수 있다.

iSQL> INSERT INTO sys.book VALUES('053494566X', 'Working Classes', 'Robert Orfali', 1, 1999, 80000, 'WILE');
1 row inserted.
iSQL> INSERT INTO sys.inventory VALUES('MICR000005', 'WILE', '28-JUN-1999', 8, 'N', '053494566X');
1 row inserted.

10) 사용자 uare10은 SELECT ANY TABLE 권한이 있기 때문에, uare9소유의 테이블을 조회할 수 있다.

iSQL> SELECT * FROM uare9.book;
ISBN                  TITLE                 AUTHOR                EDITION     PUBLISHINGYEAR PRICE       PUBCODE               
---------------------------------------------------------------------------------------------------------------------------------------
0471316156            JAVA and CORBA        Robert Orfali         2           1998        50000       PREN  
1 row selected.
iSQL> SELECT * FROM uare9.inventory;
SUBSCRIPTIONID        ISBN                  STORECODE             PURCHASEDATE QUANTITY    PAID
------------------------------------------------------------------------------------------------------------------------
TOWE000001            0471316156            TOWE                  01-JUN-2003  5           N  
1 row selected.

사용자 uare10은 SELECT ANY TABLE 권한이 있기 때문에, SYS소유의 테이블을 조회할 수 있다.

iSQL> SELECT * FROM sys.book;
ISBN                  TITLE                 AUTHOR                EDITION     PUBLISHINGYEAR PRICE       PUBCODE               
---------------------------------------------------------------------------------------------------------------------------------------
0070521824            Software Engineering  Roger S. Pressman     4           1982        100000      CHAU                  
0137378424            Database Processing   David M. Kroenke      6           1972        80000       PREN                  
053494566X            Working Classes       Robert Orfali         1           1999        80000       WILE  
3 rows selected.
iSQL> SELECT * FROM sys.inventory;
SUBSCRIPTIONID        STORECODE             PURCHASEDATE QUANTITY    PAID                  ISBN
------------------------------------------------------------------------------------------------------------------------
BORD000002            BORD                  12-JUN-2003  6           N
MICR000001            MICR                  07-JUN-2003  7           N
MICR000005            WILE                  28-JUN-1999  8           N                     053494566X  
3 rows selected.

11) 사용자 uare10은 DELETE ANY TABLE 권한이 있기 때문에, SYS와 uare9소유의 테이블의 데이터를 삭제할 수 있다.

iSQL> DELETE FROM uare9.inventory WHERE subscriptionid = 'TOWE000001';
1 row deleted.
iSQL> SELECT * FROM uare9.inventory;
SUBSCRIPTIONID        ISBN                  STORECODE             PURCHASEDATE QUANTITY    PAID
------------------------------------------------------------------------------------------------------------------------
No rows selected.

iSQL> DELETE FROM sys.inventory WHERE subscriptionid = 'MICR000005';
1 row deleted.
iSQL> SELECT * FROM sys.inventory;
SUBSCRIPTIONID        STORECODE             PURCHASEDATE QUANTITY    PAID                  ISBN
------------------------------------------------------------------------------------------------------------------------
BORD000002            BORD                  12-JUN-2003  6           N
MICR000001            MICR                  07-JUN-2003  7           N              
2 rows selected.

12) 사용자 uare9이 REVOKE ALL 구문을 사용하지 않고 uare10으로부터 모든 권한을 해제한다.

iSQL> CONNECT uare9/rose9;
Connect success.
iSQL> REVOKE ALTER ANY TABLE, INSERT ANY TABLE, SELECT ANY TABLE, DELETE ANY TABLE FROM uare10;
Revoke success.

13) 사용자 uare10의 REFERENCES 권한과 함께 관련된 참조 무결성 제약조건(referential integrity constraints)도 같이 삭제한다.

iSQL> REVOKE REFERENCES ON sys.book FROM uare10 CASCADE CONSTRAINTS;
Revoke success.

14) 사용자 uare9의 모든 시스템 권한을 해제한다.

iSQL> CONNECT sys/manager;
Connect success.
iSQL> REVOKE ALL PRIVILEGES FROM uare9;
Revoke success.

15) 사용자 uare9의 GRANT ANY PRIVILEGES 권한을 해제한다.

iSQL> REVOKE GRANT ANY PRIVILEGES FROM uare9;
Revoke success.

16) 사용자 uare9의 REFERENCES 권한을 해제한다.

iSQL> REVOKE REFERENCES ON book FROM uare9;
Revoke success.

예제 5: 롤을 이용한 객체 권한 부여#

<질의 5> user01의 T1 테이블에 대한 SELECT, UPDATE, INSERT, DELETE 객체 권한을 alti_role 롤에 부여한다. 그리고 alti_role 롤을 다른 사용자 user02에게 부여한다.

iSQL> create role alti_role;
Create success.
iSQL> create user user01 identified by user01;
Create success.
iSQL> create user user02 identified by user02;
Create success.
iSQL> connect user01/user01
Connect success.
iSQL> create table t1 (i1 integer);
Create success.
iSQL> grant select,insert,update,delete on t1 to alti_role;
Grant success.
iSQL> connect sys/manager
Connect success.
iSQL> grant alti_role to user02;
Grant success.
iSQL> connect user02/user02;
Connect success.
iSQL> insert into user01.t1 values (1);
1 row inserted.
iSQL> insert into user01.t1 values (2);
1 row inserted.
iSQL> select * from user01.t1;
T1.I1       
--------------
1           
2           
2 rows selected.
iSQL> update user01.t1 set i1=3 where i1=1;
1 row updated.
iSQL> select * from user01.t1;
T1.I1       
--------------
2           
3           
2 rows selected.
iSQL> delete from user01.t1 where i1=2;
1 row deleted.
iSQL> select * from user01.t1;
T1.I1       
--------------
3           
1 row selected.