Nếu như trong Oracle, 1 user có thể đóng vai trò schema, role là tập hợp các quyền được cấp tập trung, các khái niệm khá rõ ràng, thì trong PostgreSQL, các khái niệm này lại rắc rối hơn 1 chút và có thể gây … bối rối nếu không chú ý.

 

User

 

Đầu tiên là user. Trong PostgreSQL, user là … user, nhưng cũng có thể gọi là role có quyền login. Và user trong PostgreSQL nằm ở mức cluster database, tức là ta có thể cấp quyền cho user thao tác trên bất kỳ database con nào trong cluster database.

Ví dụ ta tạo 1 user:

 

 

Kết quả trả về là “CREATE ROLE”. Thực chất, lệnh CREATE USER tương đương với lệnh CREATE ROLE … LOGIN

 

 

Kiểm tra thử, ta có thể login bằng 2 user trên dễ dàng

 

 

Role

 

Ở trên ta đã có câu lệnh tạo role với quyền login. Lúc đó role cũng là 1 user. 

Muốn sử dụng role như 1 nhóm quyền, ta tạo role bình thường không có login, gán quyền cho role và gán role cho user:

 

 

Kiểm tra bằng lệnh \du

 

 

Ta thấy role 1 được mô tả Cannot login. Và user dev1 là member của role1.

 

Group

 

Group trong PostgreSQL cũng chính là role. CREATE GROUP tương đương CREATE ROLE … NOLOGIN

 

 

Nói chung để tiện, ta cứ nhớ tạo user bằng lệnh create user và  tạo role quyền bằng lệnh create role cho đơn giản =.=

 

Schema và Search path

 

Schema và search path là 2 điểm cần chú ý trong việc quy hoạch database PostgreSQL. Đầu tiên ta tạo thử 1 table:

 

 

Nếu như ở Oracle, table test_table1 chắc chắn sẽ nằm ở user/schema quanpt (quanpt.test_table1), thì ở đây, ta thấy test_table1 có owner là quanpt nhưng lại nằm ở schema public.

 

Đơn giản là vì trong PostgreSQL, schema là 1 khái niệm riêng biệt với user. Để tạo schema chứa các object, ta có thể dùng lệnh sau đây

 

 

Sau đó cấp quyền sử dụng cho user quanpt

 

 

Và tạo table test_table2. Ta thấy table này sẽ nằm trong schema quanpt.

 

 

Ta sẽ thử lại với user dev1, nhưng tạo 1 schema không trùng tên user như trường hợp user/schema quanpt vừa rồi.

 

 

Ta thấy table dev_test nằm ở schema public. Vấn đề này liên quan tới search path.

 

 

Search path trong PostgreSQL là chỉ định schema ưu tiên cho user thao tác.

 

Ở trên, ta thấy mặc định search path cho 1 user sẽ là “$user”, public, tức là nếu có schema trùng tên với user như user quanpt, thì khi thao tác, PostgreSQL sẽ ưu tiên thao tác object trên schema cùng tên trước.

 

Trong trường hợp user dev1, do không có schema trùng tên, nên search path đưa ra schema thứ 2 là schema public làm schema hoạt động cho user này, dẫn đến việc khi tạo table dev_test ta thấy nằm ở schema public. Schema public trong PostgreSQL là nơi công cộng, nếu không quy hoạch phân quyền tốt, dữ liệu sẽ không được kiểm soát an toàn.

 

Để khắc phục, ta có thể set search path mặc định cho user dev1 về schema devschema. Lúc này dev1 chỉ biết đến schema devschema mà thôi. 

 

 

Lưu ý là khi xài những lệnh như \dt thì sẽ bị ảnh hưởng bởi search path, nhưng không ảnh hưởng gì đến quyền của user nhé. Chẳng hạn lúc này user dev1 không thấy table nào, nhưng vẫn có quyền truy cập những table của mình hoặc đã được cấp quyền:

 

 

Tính ra cũng khá rắc rối nhỉ boring Tổng hợp cả bài lại, nếu muốn đơn giản, chúng ta nên thực hiện theo các chú ý sau:

  • Thao tác với user, cứ dùng từ khóa user cho dễ: create user, alter user…
  • Thao tác với role, sử dụng từ khóa role: create role, grant role… và chỉ coi role là nhóm quyền tập trung, tương tự như Oracle
  • Quên khái niệm group đi
  • Khi tạo user, tạo luôn schema cùng tên, set search path cho user đó về schema cùng tên
  • Phân quyền chặt chẽ, chú ý đến schema public