Khái niệm role trong PostgreSQL có đôi chút khác biệt so với các hệ quản trị CSDL quan hệ (RDBMS) khác như Oracle. Nếu như trong các RDBMS khác, role là tập hợp các quyền thì trong PostgreSQL, role vừa là user (người dùng) vừa là nhóm các quyền hay có thể nhóm các role khác.

Trong bài viết này, tôi sẽ hướng dẫn các bạn một số cách làm việc thường gặp nhất với role.

Chúng ta đã biết, role là một đối tượng trong database cluster, nó có thể là 1 user, cũng có thể là 1 nhóm (quyền hoặc role khác). Role cũng áp dụng cho toàn bộ database trong database cluster chứ không phải nó là 1 phần trong database.

Để hiểu rõ phần này, bạn cần tìm hiểu về Database cluster trong PostgreSQL là gì, bạn có thể tham khảo bài viết sau đây của tôi:

Đọc thêm  Database Cluster trong PostgreSQL là gì

   Xem thông tin role

Để xem trên Database Cluster đang có các role nào chúng ta dùng lệnh:

postgres=# select * from pg_roles;

Kết quả như sau:

hoặc đơn giản hơn, chúng ta dùng lệnh \du+ trên psql


   Tạo mới role

Để tạo Role, chúng ta dùng lệnh CREATE ROLE. VD như sau:

CREATE ROLE duy;

Sau đó bạn kiểm tra lại bằng lệnh \du+

    Role name    |                         Attributes       | Member of | Description 
-----------------+------------------------------------------+-----------+-------------
 duy             | Cannot login                             | {}        | 
 postgres        | Superuser, Create role, Create DB,       | {}        | 
                   Replication, Bypass RLS

Trong đó, postgres là role đã được tạo sẵn, nó có quyền quản trị cao nhất (superuser), còn duy là role mà tôi vừa tạo ra. Bạn có thấy ở cột Attributes, giá trị của user duy đang là Cannot login, tức là tôi đang không thể dùng role này để đăng nhập vào trong database cluster được.

Để tạo 1 role có thể đăng nhập, tôi thêm option LOGIN và chỉ đinh password như sau:

create role duy2 login password 'Abc123';

Với câu lệnh trên, tôi đã tạo ra 1 role có thể đăng nhập, tôi thử kết nối bằng role này vào database bằng câu lệnh như sau:

psql -h localhost -U duy2 -W -d postgres
Password:
Đọc thêm  Quản lý database trong PostgreSQL

Câu lệnh trên ý nghĩa là : Kết nối vào database cluster nằm trên localhost bằng role (hay user) duy2 và vào database postgres. Option -W là để nhập password sau khi ấn Enter.

Kết quả bạn nhận được sẽ như sau:

psql (13.2)
Type "help" for help.

postgres=> 

Bạn đã kết nối thành công. Tuy nhiên bạn thử tạo 1 bảng bất kỳ trên đó xem.

create table test (name varchar(20));
ERROR:  no schema has been selected to create in
LINE 1: create table test (name varchar(20));

Nguyên nhân của lỗi này, đó là do bạn phải chỉ ra schema để lưu bảng đó. Tuy nhiên ở đây, bạn vẫn chưa có quyền để ghi vào schema hay thậm chí cũng chưa có quyền kết nối vào database nào cả. Khái niệm về schema, bạn có thể tham khảo tại bài viết sau:

Đọc thêm  Quản lý Schema trong PostgreSQL

   Gán quyền cho role

Bạn cần gán thêm quyền để role (hay user) có thể kết nối vào 1 database nào đó, và tạo các đối tượng (bảng, index, view…) trên 1 schema. 2 câu lệnh sau sẽ giúp bạn thực hiện các việc đó (Nhớ login lại bằng quyền superuser nhé)

psql

postgres# GRANT CONNECT ON DATABASE postgres TO duy2;
postgres# GRANT USAGE, CREATE ON SCHEMA public TO duy2;

Bây giờ, bạn thử kết nối lại và tạo bảng xem:

postgres=> create table public.test (name text);
CREATE TABLE

Lần này thì ok rồi đó.

   Gán quyền cho role (hay user)

Giả sử bây giờ bạn có 1 bảng tên là customer thuộc user duy, bạn có thể gán quyền INSERT (chèn dữ liệu) cho user duy2 bằng câu lệnh sau:

GRANT INSERT ON CUSTOMER TO duy2;

Câu lệnh trên phải được thực hiện bởi user có đủ thẩm quyền trên bảng muốn gán quyền (VD: chủ sở hữu hoặc superuser)

Sau câu lệnh GRANT này, user duy2 đã có thể thêm dữ liệu vào bảng.

Với các quyền UPDATE, DELETE, bạn cũng làm tương tự.

Ngoài ra, như tôi nói ở trên, role có thể là 1 user hoặc cũng có thể là 1 nhóm quyền hoặc role khác. Do đó bạn hoàn toàn có thể gán 1 tập hợp các quyền cho 1 role không login và gán role đó cho 1 role có thể login khác. Như vậy, role có thể login sẽ có toàn bộ quyền đã gán cho role không thể login.


   Thay đổi và Xóa Role

Ngoài option LOGINPASSWORD của role mà tôi đã thực hành bên trên, role còn rất nhiều option khác. Tuy nhiên, ở bài viết này, tôi sẽ chỉ nêu ra các option thường dùng nhất, nếu bạn muốn tìm hiểu kỹ hơn, bạn có thể tìm đọc tài liệu chính thức của PostgreSQL tại đây.

   Thay đổi password cho Role:

Alter role duy3 password 'Abcd1234';

   Đưa role lên thành superuser

alter role duy3 superuser;

   INHERIT và NOINHERIT

INHERIT là 1 option của role. Nếu role có option này thì nó có thể grant quyền mà nó đang có cho 1 role khác. Ngược lại nếu option của role là NOINHERIT thì nó không thể grant những quyền nó đang có cho user khác được

alter role duy3 inherit;
alter role duy3 noinherit;

   Xóa bỏ role

Câu lệnh xóa bỏ role là DROP ROLE. Tuy nhiên, nếu role đó đã có những bảng do nó tạo ra rồi thì bạn có thể gặp lỗi như sau:

drop role duy3;
ERROR: role "duy3" cannot be dropped because some objects depend on it
DETAIL: privileges for schema public
owner of table test

Bạn cần chuyển sở hữu những bảng đó cho 1 role khác rồi mới xóa được

REASSIGN OWNED BY duy3 to postgres;
DROP OWNED BY duy3;
DROP ROLE duy3;

Nếu role đó có các object trên nhiều database, bạn cần phải vào từng database và thực hiện lại các câu lệnh REASSIGN OWNED BY… DROP OWNERD BY… trên từng database.

Một cách khác, bạn cũng vào từng database và revoke hết quyền của role trên database đó, rồi mới drop được.

Nguồn: https://dangxuanduy.com/

Xin cho tôi được biết, bạn cảm thấy bài viết này như thế nào? Ý kiến của bạn sẽ giúp tôi nâng cao chất lượng bài viết của mình.

    Hãy chia sẻ bài viết này nếu bạn thấy có ích nhé
    0 0 votes
    Article Rating
    Subscribe
    Notify of
    guest
    0 Comments
    Inline Feedbacks
    View all comments