PostgreSQL

Lệnh PostgreSQL CREATE ROLE

Lệnh PostgreSQL CREATE ROLE
Được viết bởi Minh Hoàng

Series chia sẻ về PostgreSQL – Cơ sở dữ liệu mã nguồn mở tiên tiến nhất thế giới.

Giới thiệu về roles trong PostgreSQL

PostgreSQL group roles

Bài viết này sẽ mô tả về roles của PostgreSQL và cách sử dụng câu lệnh CREATE ROLE để tạo role mới.

PostgreSQL sử dụng roles cũng để thể hiện tài khoản người dùng (user accounts), mà không sử dụng khái niệm người dùng (user) như các hệ thống cơ sở dữ liệu khác.

Thông thường, roles có thể đăng nhập được gọi là login roles. Chúng tương đương với người dùng (user) trong các hệ thống cơ sở dữ liệu khác.

Khi roles chứa các roles khác, chúng được gọi là group roles.

Từ phiên bản 8.1, PostgreSQL đã kết hợp người dùng (users) và nhóm (groups) thành roles.

1. Cách tạo một role mới

1. Cách tạo một role mới

Sử dụng lệnh CREATE ROLE để tạo một role mới với định dạng như sau:

CREATE ROLE name [ [ WITH ] option [ ... ] ]

option có thể là:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | BYPASSRLS | NOBYPASSRLS
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED ] PASSWORD 'password' | PASSWORD NULL
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid

※Để tạo được role, role thực thi lệnh phải là superuser hoặc có đặc quyền CREATEROLE.

Khi bạn tạo một role mới thì nó sẽ có hiệu lực trong tất cả các cơ sở dữ liệu trong máy chủ cơ sở dữ liệu PostgreSQL (hoặc cluster).

Mặc dù có nhiều option – cũng là thuộc tính của role (role attributes), định dạng cơ bản khi sử dụng cho mục đích xác thực người dùng (user authentication) bằng role như sau:

CREATE ROLE name [ WITH ] LOGIN PASSWORD 'password';

Chỉ định tên role name và tạo một role có thể được sử dụng làm mục tiêu xác thực người dùng khi kết nối với PostgreSQL từ máy khách (client), với mật khẩu ‘password’ được sử dụng để xác thực.

Chúng ta sẽ thử tạo một role mới có nameminhhoangblog với password‘12345678’ như sau

CREATE ROLE minhhoangblog WITH LOGIN PASSWORD '12345678';

Lệnh PostgreSQL CREATE ROLE (1)

Sau đó hiển thị danh sách các roles đã được tạo bằng lệnh ¥du

Lệnh PostgreSQL CREATE ROLE (2)


Lệnh ¥du liệt kê tất cả các roles hiện có trong máy chủ cơ sở dữ liệu PostgreSQL hiện tại. Còn nếu muốn lấy cả các roles của hệ thống (system roles) bắt đầu bằng pg_ thì bạn có thể truy vấn chúng từ danh mục hệ thống (system catalog) pg_roles như sau:

SELECT rolname FROM pg_roles;

Lệnh PostgreSQL CREATE ROLE (3)

2. Cách kết nối với PostgreSQL bằng role đã tạo

2. Cách kết nối với PostgreSQL bằng role đã tạo

Chúng ta sẽ kết nối đến database mydb bằng role minhhoangblog đã tạo ở trên và nhập password 12345678 để kết nối với lệnh như sau:

psql -U minhhoangblog -d mydb

Lệnh PostgreSQL CREATE ROLE (4)

Khi sử dụng psql, nếu bạn bỏ qua cơ sở dữ liệu để kết nối, thì mặc định sẽ cố gắng kết nối đến cơ sở dữ liệu có cùng tên với tên role, nhưng vì cơ sở dữ liệu có tên minhhoangblog chưa được tạo, nên lần này chúng ta đã chỉ định rõ ràng tên cơ sở dữ liệu đã có sẵn để kết nối đến là mydb.

3. Giải thích một số option của lệnh CREATE ROLE

3. Giải thích một số option của lệnh CREATE ROLE

Phần này sẽ mô tả các tùy chọn liên quan đến quyền hạn trong số các tùy chọn có thể được chỉ định bằng lệnh CREATE ROLE

SUPERUSER hoặc NOSUPERUSER

Nếu bạn chỉ định SUPERUSER, role bạn tạo sẽ là superuser. Hãy cẩn thận khi tạo bởi vì superuser sẽ có hầu hết các đặc quyền (privileges).

Ngay sau khi cài đặt hoàn thành PostgreSQL, một superuser có tên là postgres sẽ được tạo mặc định.

Nếu bạn chỉ định NOSUPERUSER thì sẽ tạo một role không phải là superuser. Và nếu option này bị bỏ qua CREATE ROLE name; thì NOSUPERUSER được chỉ định theo mặc định.

CREATE ROLE name 
SUPERUSER
LOGIN 
PASSWORD 'password';

Role superuser có thể ghi đè tất cả các hạn chế truy cập trong cơ sở dữ liệu. Do đó, bạn chỉ nên tạo role này khi cần.

※Lưu ý rằng role của bạn phải là một superuser để tạo một role superuser khác.

CREATEDB hoặc NOCREATEDB

Nếu bạn chỉ định CREATEDB thì role bạn tạo có đặc quyền để tạo cơ sở dữ liệu. Cơ sở dữ liệu không thể được tạo khi NOCREATEDB được chỉ định.

Nếu option này bị bỏ qua CREATE ROLE name; thì NOCREATEDB được chỉ định theo mặc định.

CREATE ROLE name 
CREATEDB
LOGIN 
PASSWORD 'password';

CREATEROLE hoặc NOCREATEROLE

Nếu bạn chỉ định CREATEROLE, role bạn tạo có đặc quyền để tạo mới một role. Nếu NOCREATEROLE được chỉ định thì role mới tạo không được phép tạo role mới.

※Lưu ý rằng một role khi được cấp đặc quyền CREATEROLE có thể tạo ra các role mới có các đặc quyền mà nó không có. Vì vậy, việc chỉ định CREATEROLE có ý nghĩa tương tự như việc cấp gần như tất cả các đặc quyền.

Nếu option này bị bỏ qua CREATE ROLE name; thì NOCREATEROLE được chỉ định theo mặc định.

CREATE ROLE name 
CREATEROLE
LOGIN 
PASSWORD 'password';

Ví dụ tạo một role mới có quyền CREATEDBCREATEROLE

CREATE ROLE minhhn CREATEDB CREATEROLE LOGIN PASSWORD '12345678';

Lệnh PostgreSQL CREATE ROLE (5)

Nhìn vào phần thuộc tính của role mới được tạo, nó được hiển thị rằng role minhhn có quyền “role có thể được tạo” và “DB có thể được tạo“.

Lệnh PostgreSQL CREATE ROLE (6)

VALID UNTIL ‘timestamp’

Tạo role với thời gian password hiệu lực bằng cách đặt ngày và thời gian sau đó mật khẩu của role không còn hợp lệ.

Ví dụ sau đây tạo một role minhhoang với mật khẩu hợp lệ cho đến hết năm 2022:

CREATE ROLE minhhoang WITH
LOGIN
PASSWORD '12345678'
VALID UNTIL '2023-01-01';

Nếu mật khẩu hết hạn và trở nên không hợp lệ thì bạn không thể xác thực (authenticate) ngay cả khi bạn đặt mật khẩu mới. Để kích hoạt (enable) role xác thực lại mật khẩu, bạn phải hủy cài đặt hết hạn mật khẩu bằng lệnh ALTER ROLE

Để hủy cài đặt hết hạn mật khẩu cho role minhhoang thì sẽ chỉ định ngày và giờ sớm hơn ngày hiện tại là ngày hết hạn hoặc thiết lập infinity có nghĩa là vô hạn.

ALTER ROLE minhhoang WITH VALID UNTIL 'infinity';

Lệnh PostgreSQL CREATE ROLE (9)

Kiểm tra lại thuộc tính của role minhhoang chúng ta thấy rằng kỳ hạn hiệu lực của mật khẩu đã được thay đổi thành infinity (vô hạn)

\du minhhoang

Lệnh PostgreSQL CREATE ROLE (10)

CONNECTION LIMIT connlimit

Để chỉ định số lượng kết nối đồng thời mà một role có thể thực hiện, bạn hãy sử dụng option CONNECTION LIMIT

Sau đây tạo ra một role mới fpt_minhhn có thể được 1000 kết nối đồng thời:

CREATE ROLE fpt_minhhn WITH
LOGIN
PASSWORD '12345678'
CONNECTION LIMIT 1000;

Lệnh PostgreSQL CREATE ROLE (7)

Cùng xem tất cả các role mà chúng ta đã tạo nãy giờ:

Lệnh PostgreSQL CREATE ROLE (8)

Xem thêm: https://www.postgresql.org/docs/current/sql-createrole.html.

Cảm ơn bạn đã theo dõi. Đừng ngần ngại hãy cùng thảo luận với chúng tôi!

Giới thiệu

Minh Hoàng

Xin chào, tôi là Hoàng Ngọc Minh, hiện đang làm BrSE, tại công ty Toyota, Nhật Bản. Những gì tôi viết trên blog này là những trải nghiệm thực tế tôi đã đúc rút ra được trong cuộc sống, quá trình học tập và làm việc. Các bài viết được biên tập một cách chi tiết, linh hoạt để giúp bạn đọc có thể tiếp cận một cách dễ dàng nhất. Hi vọng nó sẽ có ích hoặc mang lại một góc nhìn khác cho bạn[...]

Translate »