GRANT
GRANT#
구문#
grant ::=#
grant_system_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.
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.