CodeGym /課程 /SQL SELF /用 GRANT 和 REVOKE 設定存取權限

用 GRANT 和 REVOKE 設定存取權限

SQL SELF
等級 47 , 課堂 2
開放

想像一下,你的資料就像一座堡壘,每個堡壘裡的人都有自己的權限:有人只能在院子裡走動,有人保管寶庫的鑰匙,有人坐在王座廳掌控一切。在我們的資料庫裡,這些角色就是靠 GRANTREVOKE 指令來搞定的。這兩個指令就是決定誰能去哪裡、能幹嘛的關鍵。

GRANT 指令就像一般的 grant 一樣,可以把資源(像是資料庫、table、schema)授權給特定角色。這有點像「派對邀請函」,你決定誰能讀、誰能寫、誰能把家具拆了。

REVOKE 指令則是把之前給的權限收回。就像說:「欸,派對對你結束了,鑰匙記得放門口。」

GRANT 給予權限

先從最高層級——資料庫開始。要讓使用者能連線到資料庫,得先給他連線權限。用這個指令:

GRANT CONNECT ON DATABASE database_name TO role_name;

比如說,我們有個資料庫叫 university,角色叫 student,我們可以這樣讓學生連線:

GRANT CONNECT ON DATABASE university TO student;

但光能連線還不代表能為所欲為。要讓使用者能在資料庫裡創建物件,還得給他 CREATE 權限:

GRANT CREATE ON DATABASE university TO student;

你可以用這個指令檢查資料庫權限:

\l+ university

REVOKE 收回權限

如果學生突然行為怪怪的(比如說創了一堆我們沒預期的 table),我們可以用這個指令收回他的 CREATE 權限:

REVOKE CREATE ON DATABASE university FROM student;

這樣之後學生只能連線,不能再「創作」了。

在 schema 層級設定權限

schema 基本上就是資料庫裡的一個「房間」,裡面放著 table、view 跟其他物件。要讓使用者能操作 schema 裡的東西,可以設定讀、寫或創建物件的權限。

給 schema 權限

假設我們有個 schema 叫 public(每個資料庫預設都會有)。我們可以讓使用者瀏覽 schema 內容:

GRANT USAGE ON SCHEMA public TO student;

但光有 USAGE 還不夠,要能創建新物件還要加上:

GRANT CREATE ON SCHEMA public TO student;

這樣學生就能在 public schema 裡不只讀,還能創建 table。

取消 schema 權限

如果學生開始亂創一些像 bad_idea_01 這種奇怪的 table,我們可以限制他的權限:

REVOKE CREATE ON SCHEMA public FROM student;

這樣學生就不能再加新 table 了。秩序恢復!

在 table 層級設定權限

table 大概是資料庫裡最熱門的物件了。來看看怎麼設定 table 的存取權限。這裡有三大類操作:讀、寫、改。

讀取權限

要讓使用者能讀 table 內容,用這個指令:

GRANT SELECT ON TABLE table_name TO role_name;

比如讓學生能讀 courses 這個 table:

GRANT SELECT ON TABLE courses TO student;

現在 student 這個使用者就能對 courses table 下 SELECT 查詢了。

寫入權限

如果你想讓使用者能插入新資料到 table,可以這樣設定:

GRANT INSERT ON TABLE table_name TO role_name;

範例:

GRANT INSERT ON TABLE courses TO student;

現在學生可以往 table 加新課程。不過等等...這真的是好主意嗎?

修改和刪除權限

如果使用者要能更新現有資料或刪除資料,就要給他 UPDATEDELETE 權限。

GRANT UPDATE ON TABLE courses TO student;
GRANT DELETE ON TABLE courses TO student;

小提醒:這兩個權限不要亂給。如果讓學生能刪資料,他們可能不小心(或故意)把一切搞砸。

範例:建立有限權限的角色

假設我們要為老師建立一個角色,他們只能讀學生和課程資料,不能刪除紀錄。這樣做:

  1. 建立角色:
CREATE ROLE teacher;
  1. studentscourses table 的讀取權限:
GRANT SELECT ON TABLE students, courses TO teacher;
  1. 限制刪除權限:
REVOKE DELETE ON TABLE students, courses FROM teacher;

這樣老師就只有需要的權限,其他什麼都不能做。

怎麼靈活搭配 GRANTREVOKE

假設我們有個角色叫 intern,我們想限制他。他只能存取課程資料,絕對不能碰學生資料。這樣做:

  1. 只給 courses table 的權限:
GRANT SELECT, INSERT ON TABLE courses TO intern;
  1. 確保 intern 沒有 students table 的權限:
REVOKE ALL ON TABLE students FROM intern;

這樣就能精確設定存取權限了。

實際專案中的應用範例

這種權限管理機制在實際專案裡超常見。比如:

  1. 在網路商店,user 和 order table 的權限會分給「管理員」、「操作員」和「訪客」這幾種角色。
  2. 在大學系統裡,管理員可以新增和修改課程,學生只能瀏覽課程。
  3. 在銀行系統,客戶帳戶的存取權會依部門分配給不同員工。
2
任務
SQL SELF, 等級 47, 課堂 2
上鎖
設定資料表權限並撤銷存取
設定資料表權限並撤銷存取
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION