CodeGym /課程 /SQL SELF /建立與管理角色:ROLES

建立與管理角色:ROLES

SQL SELF
等級 47 , 課堂 1
開放

角色 在 PostgreSQL 裡可以代表單一個使用者,也可以是一群使用者。它負責管理對資料庫、資料表、schema 以及其他物件的存取權限。

當你建立一個角色時,預設它不會直接綁定到某個使用者或群組,但你可以給它設定屬性和權限,讓它符合你的需求。

角色跟使用者有什麼不同?

那使用者呢?這裡很容易搞混。在 PostgreSQL 裡,使用者其實也是一種角色,只是有個特點:使用者一定可以登入系統。也就是說,只要一個角色有 LOGIN 屬性,它就可以當作使用者。如果你只是想把一群人集合起來,或是不想讓這個角色能登入,就不用加 LOGIN 屬性。

舉個例子:

  • LOGIN 屬性的角色 = 使用者。
  • 沒有 LOGIN 的角色 = 群組或「服務角色」。

建立角色

要建立角色,用 CREATE ROLE 指令。語法長這樣:

CREATE ROLE <角色名稱> [WITH] [參數];

這裡的 參數 就是角色的屬性,比如:

  • LOGIN — 能不能登入資料庫。
  • CREATEDB — 能不能建立資料庫。
  • CREATEROLE — 能不能建立其他角色。
  • SUPERUSER — 超級權限(這個很危險,小心用)。
  • PASSWORD — 登入密碼。

來看個建立使用者角色的例子。
假設你想建立一個叫 student 的使用者,可以登入系統並有密碼。你可以這樣下指令:

CREATE ROLE student WITH LOGIN PASSWORD 'securePassword123';

這樣就會建立一個叫 student 的角色,可以連線到資料庫。

現在我們來建立一個叫 teachers 的群組角色。群組角色不需要 LOGIN 屬性,因為群組裡的使用者會用自己的帳號登入。

CREATE ROLE teachers;

分配權限給角色

PostgreSQL 裡建立角色,就是為了分配或限制資源存取。這時會用到 GRANTREVOKE 這兩個指令。

GRANT 給權限

語法如下:

GRANT <權限> ON <物件> TO <角色>;

我們來建立一個 courses 資料表,然後給 teachers 這個角色讀取和修改這個表的權限。

-- 建立資料表
CREATE TABLE courses (
    id SERIAL PRIMARY KEY,
    name TEXT NOT NULL,
    teacher_id INT
);

-- 給予存取權限
GRANT SELECT, INSERT, UPDATE ON courses TO teachers;

現在所有屬於 teachers 這個角色的使用者,都可以查詢、加入和修改 courses 這個表的資料。

REVOKE 收回權限

要收回權限,用 REVOKE 指令。語法:

REVOKE <權限> ON <物件> FROM <角色>;

如果你想禁止 teachers 這個群組修改 courses 這個表的資料,可以這樣做:

REVOKE UPDATE ON courses FROM teachers;

角色階層:繼承

使用者可以「繼承」群組角色的權限,這樣管理起來比較方便。就像把「遺產」從一個人傳給另一個人一樣。

INHERIT 關鍵字讓角色可以繼承另一個角色的權限。這個行為預設是開啟的,但你也可以關掉。

舉個例子:

-- 把使用者 `john` 加進 `teachers` 群組
GRANT teachers TO john;

現在 john 這個使用者就自動擁有 teachers 群組角色的所有權限。

來查一下權限:

\du john

如果你想關掉繼承,建立角色時加上 NOINHERIT 屬性。

CREATE ROLE admin NOINHERIT;

這樣屬於 admin 這個角色的使用者,預設就不能直接用它的權限。

建立角色群組來管理存取

角色群組可以讓你更輕鬆管理權限,特別是在大型專案裡。你不用一個一個給使用者分配權限,只要把他們加進群組,再給群組權限就好。

來看個簡單的群組角色例子。我們先建立兩個群組:

  • students — 學生群組。
  • teachers — 教師群組。
CREATE ROLE students;
CREATE ROLE teachers;

把使用者加進群組:

-- 把 john 加進 students 群組
GRANT students TO john;

-- 把 jane 加進 teachers 群組
GRANT teachers TO jane;

現在只要給 studentsteachers 這兩個群組資料表的權限,所有成員都會自動有權限!

實作練習

  1. 建立一個 exams 資料表,欄位有:
    • id: 主鍵;
    • subject: 文字;
    • teacher_id: 教師 ID。
CREATE TABLE exams (
    id SERIAL PRIMARY KEY,
    subject TEXT NOT NULL,
    teacher_id INT
);
  1. 建立 studentsteachers 兩個角色群組。
CREATE ROLE students;
CREATE ROLE teachers;
  1. teachers 群組新增和修改 exams 資料表的權限。
GRANT INSERT, UPDATE ON exams TO teachers;
  1. students 群組只有查詢的權限。
GRANT SELECT ON exams TO students;
  1. 建立一個叫 alice 的使用者,並加進 students 群組。
CREATE ROLE alice WITH LOGIN PASSWORD 'alicePassword';
GRANT students TO alice;
  1. alice 的帳號登入,檢查她有什麼權限。

現在你已經知道怎麼建立角色、管理權限,還有怎麼用群組角色讓管理更簡單。下一堂課我們會講怎麼用 GRANTREVOKE 指令,來更細緻地管理資料庫、schema 和資料表的存取權限。

留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION