Sunday, May 4, 2014

RESOURCE ส่วนเกินสิทธิ์

โพสต์ครั้งแรก: 12 ธันวาคม 2011

กติแล้วเวลาเราสร้าง User บนฐานข้อมูล Oracle เราจะ grant บทบาท (ROLE) ที่เป็น CONNECT,RESOURCE ให้ วันนี้เราจะมาดูว่าการ Grant แบบนี้มีผลอย่างไรกับ User ที่เราสร้างขึ้น เริ่มจาก Role CONNECT ก่อน โดยทั่วไปเรา grant สิทธิ์ CONNECT ให้เพื่อให้ User นั้น ๆ สามารถล็อกอินเข้าฐานข้อมูลได้
sys@PAO1> create user korn identified by korn
2 default tablespace users;
User created.

sys@PAO1> conn korn/korn@PAO1
ERROR:
ORA-01045: user KORN lacks CREATE SESSION privilege; logon denied
Warning: You are no longer connected to ORACLE.

sys@PAO1> conn sys@PAO1 as sysdba
Enter password:
Connected.

sys@PAO1> grant connect to korn;
Grant succeeded.

sys@PAO1> conn korn/korn
Connected.
korn@PAO1> create table t (id number);
create table t (id number)
*
ERROR at line 1:
ORA-01031: insufficient privileges

จะเห็่นว่าถ้าเราไม่ได้ grant สิทธิ์ที่เหมาะสมให้ User จะไม่สามารถล็อกอินเข้าฐานข้อมูลได้ เมื่อล็อกอินเข้าได้แล้วหากไม่ได้ grant สิทธิ์ที่เหมาะสมก็ยังไม่สามารถสร้าง Object ใด ๆ ได้เช่นกัน สิทธิ์ที่นิยม grant ให้เป็น Role ที่ชื่อว่า RESOURCE ซึ่งโดยหลัก ๆ แล้วจะทำให้ User สามารถ ทำสิ่งต่อไปนี้ได้

  • CREATE TRIGGER
  • CREATE SEQUENCE
  • CREATE TYPE
  • CREATE PROCEDURE
  • CREATE CLUSTER
  • CREATE OPERATOR
  • CREATE INDEXTYPE
  • CREATE TABLE

อย่างไรก็ตาม Role นี้ยังให้สิทธิ์แฝงมาอีกอันหนึ่งคือ UNLIMITED TABLESPACE ซึ่งทำให้ User สามารถไปสร้าง Object บน Tablespace ใดก็ได้มีขนาดเท่าใดก็ได้ (ตามแต่พื้นที่บน Tablespace จะเพียงพอ)

korn@PAO1> conn sys@pao1 as sysdba
Enter password:
Connected.
sys@PAO1> grant resource to korn;

Grant succeeded.
sys@PAO1> conn korn@pao1
Enter password:
Connected.
korn@PAO1> create table t (id number) tablespace system;

Table created.

korn@PAO1> select privilege from user_sys_privs;

PRIVILEGE
---------------------------------------
UNLIMITED TABLESPACE

korn@PAO1> select granted_role from user_role_privs
2 where username = 'KORN';

GRANTED_ROLE
------------------------------
CONNECT
RESOURCE


จะเห็นว่านอกจาก Role ทั้งสองที่เรา Grant ให้แล้ว ยังมี System Privilege ที่ชื่อ "UNLIMITED TABLESPACE" อยู่อีกตัวซึ่งทำให้ KORN สามารถสร้าง Object บน Tablespace ใด ๆ ได้ไม่จำกัดขนาด หากเราไม่ต้องการให้ KORN สามารถไปสร้าง Object บน Tablespace อื่นนอกจาก Default Tablespace ที่กำหนดไว้ให้กับ User แล้ว เราจะต้อง Revoke สิทธิ์นี้ออกโดยใช้คำสั่ง REVOKE

korn@PAO1> conn sys@pao1 as sysdba
Enter password:
Connected.
sys@PAO1> revoke unlimited tablespace from korn;

Revoke succeeded.

sys@PAO1> conn korn@pao1
Enter password:
Connected.
korn@PAO1> create table t2 (id number) tablespace system;
create table t2 (id number) tablespace system
*
ERROR at line 1:
ORA-01536: space quota exceeded for tablespace 'SYSTEM'

korn@PAO1> create table t2 (id number) tablespace users;
create table t2 (id number) tablespace users
*
ERROR at line 1:
ORA-01950: no privileges on tablespace 'USERS'


จากตัวอย่างข้างบนจะเห็นว่า แม้เราต้องการสร้าง Object บน Tablespace USERS ซึ่งเป็น Default Tablespace (ระบุเมื่อตอนเราสร้าง USER) เราก็ยังไม่สามารถสร้างได้ทั้งนี้เนื่องจาก พอเรา Revoke สิทธิ์ UNLIMITED TABLESPACE จะทำให้สิทธิ์บน Tablespace USERS หายไปด้วย เราจะต้องระบุ Quota ให้กับ User ในการใช้พื้นที่บน Tablespace ด้วย

korn@PAO1> conn sys@pao1 as sysdba
Enter password:
Connected.
sys@PAO1> alter user korn quota unlimited on users;

User altered.

sys@PAO1> conn korn@pao1
Enter password:
Connected.
korn@PAO1> create table t2 (id number) tablespace users;

Table created.
korn@PAO1> -- Clearing
korn@PAO1> drop table t purge;

Table dropped.

korn@PAO1> drop table t2 purge;

Table dropped.

ถ้าจัดเป็นชุดรวมกัน คำสั่งสร้าง User แบบย่อ ๆ ของผมจะมีหน้าตาแบบนี้ครับ
create user korn identified by korn default tablespace users;
grant connect,resource to korn;
revoke unlimited tablespace from korn;
alter user korn quota unlimited on users;

No comments:

Post a Comment