การใช้ grant และ grant with grant option ใน Oracle

การใช้คำสั่ง grant

โดยทั่วไปเมื่อต้องการให้สิทธิ์สำหรับดำเนินการกับ object ใด ๆ ของ user หนึ่งให้กับอีก user หนึ่ง จะใช้คำสั่งคือ grant ตัวอย่าง เช่น

  • user1 เป็นเจ้าของตารางชื่อ table01
  • ในฐานข้อมูลมี user ชื่อ user2 อยู่ในฐานข้อมูลเดียวกับ user1
  • ต้องการให้ user2 สามารถใช้คำสั่ง select ข้อมูลจากตาราง table01 ของ user1
  • บน user1 ดำเนินการโดยใช้คำสั่งในการให้สิทธิ์คือ

grant select on user1.table01 to user2;

  • หลังจากให้สิทธิ์แล้ว บน user2 สามารถใช้คำสั่งในการ select ข้อมูลจากตาราง table01 ของ user1 ได้ ตังตัวอย่างดังนี้

select * from user1.table01; //ต้องระบุ user คั่นด้วยจุด และตามด้วยชื่อตาราง

  • การให้สิทธิ์ นอกจาก select แล้ว ยังมีสิทธิ์อื่น ๆ อีก เช่น insert, update, delete, execute ฯลฯ
  • ตัวอย่างการให้สิทธิ์มากกว่าหนึ่งสิทธิ์

grant select, insert, update, delete on user1.table01 to user2;

การใช้คำสั่ง grant with grant option

รูปแบบการใช้คำสั่งคือ หลังคำสั่ง grant ปกติ ตามด้วย with grant option

เช่น grant select on user1.table01 to user2 with grant option;

ผลจากการใช้คำสั่ง with grant option จะมีผลให้ user ที่ได้รับสิทธิ์ สามารถให้สิทธิ์ที่ได้รับมา grant ต่อไปให้กับ user อื่นต่อได้นั่นเอง

  • ต่อเนื่องจากตัวอย่างแรก มี user3 ในฐานข้อมูลเดียวกันกับ user1 และ user2
  • เมื่อ user1 ใช้คำสั่ง

grant select on user1.table01 to user2 with grant option;

  • มีผลทำให้ user2 สามารถ grant สิทธิ์ในการ select ให้กับ user อื่นต่อได้ เช่น

grant select on user1.table01 to user3;

user ที่ได้รับสิทธิ์ grant with option สามารถ ใช้ grant with option ต่อให้กับ user อื่นได้หรือไม่ ???

  • user ที่ได้รับการ grant ด้วยคำสั่ง with grant option สามารถ grant ให้ user อื่นด้วยคำสั่ง with grant option ด้วยเช่นกัน
  • ตัวอย่าง เช่น มี user4 ในฐานข้อมูลเดียวกับ user1, user2, user3
  • ต่อเนื่องจากตัวอย่างก่อนหน้านี้ user3 สามารถใช้คำสั่ง with grant option ต่อให้กับ user4 ได้ หาก user2 ได้ grant ให้ user3 ด้วยคำสั่ง with grant option

ข้อควรระวัง

  • จะเห็นว่าในการใช้คำสั่ง grant with grant option นั้น จะทำให้ user ที่ได้รับสิทธิ์นี้ สามารถ grant สิทธิ์ต่อ ๆ กันไปให้กับ user อื่น ๆ เป็นทอด ๆ ด้วยคำสั่ง with grant option เช่นกัน
  • เมื่อ user อื่นที่ไม่ใช่เจ้าของ object ที่ถูก grant ได้รับสิทธิ์ในการ grant with option จะเห็นว่าจะทำให้การควบคุมการให้สิทธิ์ทำได้ยาก หรืออาจจะเกิดความไม่ปลอดภัยเกิดขึ้น ดังนั้น ถ้าไม่จำเป็นจึงไม่ควรให้สิทธิ์แบบ with grant option นั่นเอง

การยกเลิกการให้สิทธิ์

เมื่อต้องการยกเลิกการให้สิทธิ์ สามารถทำได้โดยใช้คำสั่ง revoke ตัวอย่างเช่น

revoke select, insert, update, delete on user1.table01 from user2;

จะเป็นการยกเลิกการให้สิทธิ์ในการ select, insert, update, delete บนตาราง table01 ของ user1 ที่เคยให้กับ user2

ตรวจสอบได้อย่างไร ว่าเคย grant อะไรไปบ้าง

มี view ของระบบที่ช่วยให้สามารถตรวจสอบได้ว่า object ใด ถูก grant อะไรไปบ้าง ซึ่ง view นี้เป็นของ user sys

  • view ที่เก็บข้อมูลการ grant ของ object ต่าง ๆ ชื่อ dba_tab_privs
  • มีฟีลด์ที่น่าสนใจคือ
    • grantee คือ user ที่ได้รับสิทธิ์
    • owner คือ user ที่เป็นเจ้าของ object
    • table_name คือ ชื่อ object (ชื่อของ table, view ฯลฯ)
    • grantor คือ user ที่เป็นผู้ให้สิทธิ์ (อาจจะไม่ใช่เจ้าของ object ก็ได้)
    • privilege คือ สิทธิ์ที่ได้รับ
    • grantable คือ user ที่เป็น grantee สามารถ grant สิทธิ์ต่อได้หรือไม่