想像一下,你的資料就像一座堡壘,每個堡壘裡的人都有自己的權限:有人只能在院子裡走動,有人保管寶庫的鑰匙,有人坐在王座廳掌控一切。在我們的資料庫裡,這些角色就是靠 GRANT 和 REVOKE 指令來搞定的。這兩個指令就是決定誰能去哪裡、能幹嘛的關鍵。
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 加新課程。不過等等...這真的是好主意嗎?
修改和刪除權限
如果使用者要能更新現有資料或刪除資料,就要給他 UPDATE 和 DELETE 權限。
GRANT UPDATE ON TABLE courses TO student;
GRANT DELETE ON TABLE courses TO student;
小提醒:這兩個權限不要亂給。如果讓學生能刪資料,他們可能不小心(或故意)把一切搞砸。
範例:建立有限權限的角色
假設我們要為老師建立一個角色,他們只能讀學生和課程資料,不能刪除紀錄。這樣做:
- 建立角色:
CREATE ROLE teacher;
- 給
students和coursestable 的讀取權限:
GRANT SELECT ON TABLE students, courses TO teacher;
- 限制刪除權限:
REVOKE DELETE ON TABLE students, courses FROM teacher;
這樣老師就只有需要的權限,其他什麼都不能做。
怎麼靈活搭配 GRANT 和 REVOKE
假設我們有個角色叫 intern,我們想限制他。他只能存取課程資料,絕對不能碰學生資料。這樣做:
- 只給
coursestable 的權限:
GRANT SELECT, INSERT ON TABLE courses TO intern;
- 確保
intern沒有studentstable 的權限:
REVOKE ALL ON TABLE students FROM intern;
這樣就能精確設定存取權限了。
實際專案中的應用範例
這種權限管理機制在實際專案裡超常見。比如:
- 在網路商店,user 和 order table 的權限會分給「管理員」、「操作員」和「訪客」這幾種角色。
- 在大學系統裡,管理員可以新增和修改課程,學生只能瀏覽課程。
- 在銀行系統,客戶帳戶的存取權會依部門分配給不同員工。
GO TO FULL VERSION