Câu lệnh GRANT trong MySQL được sử dụng để cấp quyền cho người dùng hoặc nhóm người dùng trên các đối tượng như cơ sở dữ liệu, bảng, cột, thủ tục, hàm, hoặc trên toàn bộ hệ thống. Việc quản lý quyền sử dụng người dùng là rất quan trọng trong MySQL để bảo mật và phân quyền rõ ràng.

Dưới đây là hướng dẫn chi tiết về câu lệnh GRANT trong MySQL, bao gồm các trường hợp từ cơ bản đến nâng cao.

1. Cú pháp cơ bản của câu lệnh GRANT

GRANT quyền [quyền,...] 
ON đối_tượng
TO 'người_dùng'@'máy_chủ'
[IDENTIFIED BY 'mật khẩu']
[WITH GRANT OPTION];

Trong đó:

  • quyền: Danh sách các quyền muốn cấp (xem phần danh sách quyền phổ biến bên dưới).
  • đối_tượng: Có thể là cơ sở dữ liệu, bảng, cột hoặc toàn hệ thống (ví dụ: *.* nghĩa là tất cả các cơ sở dữ liệu).
  • người_dùng: Tên người dùng MySQL.
  • máy_chủ: Địa chỉ máy chủ mà người dùng có thể kết nối (có thể là % để chỉ định tất cả máy chủ).
  • WITH GRANT OPTION: Nếu có thêm tùy chọn này, người dùng được cấp quyền cũng có quyền cấp lại quyền đó cho người dùng khác.

2. Các quyền phổ biến

  • ALL PRIVILEGES: Cấp tất cả các quyền.
  • SELECT: Cho phép đọc dữ liệu từ bảng.
  • INSERT: Cho phép chèn dữ liệu vào bảng.
  • UPDATE: Cho phép cập nhật dữ liệu trong bảng.
  • DELETE: Cho phép xóa dữ liệu từ bảng.
  • CREATE: Cho phép tạo cơ sở dữ liệu hoặc bảng.
  • DROP: Cho phép xóa cơ sở dữ liệu hoặc bảng.
  • ALTER: Cho phép thay đổi cấu trúc bảng.
  • INDEX: Cho phép tạo và xóa chỉ mục.
  • EXECUTE: Cho phép thực thi các thủ tục lưu trữ hoặc hàm.
  • GRANT OPTION: Cho phép cấp quyền cho người dùng khác.

3. Ví dụ cấp quyền cơ bản

3.1. Cấp quyền toàn bộ cho một người dùng

Để cấp tất cả các quyền (ALL PRIVILEGES) trên toàn hệ thống cho người dùng user1 kết nối từ bất kỳ máy chủ nào:

GRANT ALL PRIVILEGES ON *.* TO 'user1'@'%';

Câu lệnh trên sẽ cấp tất cả các quyền cho người dùng user1 để thực hiện bất kỳ thao tác nào trên tất cả các cơ sở dữ liệu từ bất kỳ máy chủ nào.

3.2. Cấp quyền truy cập vào một cơ sở dữ liệu

Để cấp quyền SELECT, INSERT, và UPDATE cho người dùng user2 chỉ trên cơ sở dữ liệu shop:

GRANT SELECT, INSERT, UPDATE ON shop.* TO 'user2'@'localhost';

Câu lệnh trên cấp quyền truy cập cho user2 chỉ có thể thực hiện các quyền được cấp trên tất cả các bảng trong cơ sở dữ liệu shop.

4. Cấp quyền trên bảng cụ thể

Bạn có thể giới hạn quyền chỉ trên một bảng cụ thể trong một cơ sở dữ liệu.

Ví dụ:

Cấp quyền SELECTDELETE cho người dùng user3 chỉ trên bảng employees của cơ sở dữ liệu company:

GRANT SELECT, DELETE ON company.employees TO 'user3'@'localhost';

Người dùng user3 sẽ chỉ có thể đọc và xóa dữ liệu trong bảng employees của cơ sở dữ liệu company.

5. Cấp quyền cho cột cụ thể

Bạn cũng có thể cấp quyền chỉ trên một hoặc nhiều cột trong bảng.

Ví dụ:

Cấp quyền SELECT cho người dùng user4 chỉ trên cột first_namelast_name của bảng customers:

GRANT SELECT (first_name, last_name) ON shop.customers TO 'user4'@'localhost';

Người dùng user4 chỉ có quyền đọc cột first_namelast_name trong bảng customers.

6. Cấp quyền sử dụng thủ tục và hàm lưu trữ

Để cấp quyền thực thi (EXECUTE) các thủ tục lưu trữ hoặc hàm cho một người dùng cụ thể, bạn có thể sử dụng quyền EXECUTE.

Ví dụ:

Cấp quyền EXECUTE cho người dùng user5 trên tất cả các thủ tục trong cơ sở dữ liệu finance:

GRANT EXECUTE ON finance.* TO 'user5'@'localhost';

Người dùng user5 sẽ có quyền thực thi tất cả các thủ tục lưu trữ và hàm trong cơ sở dữ liệu finance.

7. Cấp quyền với tùy chọn cấp tiếp (GRANT OPTION)

Sử dụng WITH GRANT OPTION để cho phép người dùng được cấp quyền có thể cấp lại quyền đó cho người dùng khác.

Ví dụ:

Cấp tất cả các quyền cho người dùng admin và cho phép họ cấp quyền lại cho người dùng khác:

GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;

Người dùng admin giờ đây có thể cấp các quyền của họ cho các người dùng khác.

8. Cấp quyền chỉ cho một số kết nối cụ thể

Bạn có thể giới hạn quyền truy cập của người dùng chỉ từ một địa chỉ IP cụ thể hoặc từ máy chủ cụ thể.

Ví dụ:

Cấp quyền SELECT cho người dùng user6 chỉ khi họ kết nối từ địa chỉ IP 192.168.1.100:

GRANT SELECT ON *.* TO 'user6'@'192.168.1.100';

Người dùng user6 sẽ chỉ có thể đọc dữ liệu khi họ kết nối từ địa chỉ IP 192.168.1.100.

9. Xem quyền của người dùng

Để xem quyền của một người dùng cụ thể, bạn có thể sử dụng câu lệnh:

SHOW GRANTS FOR 'user_name'@'host';

Ví dụ:

Xem quyền của người dùng user7:

SHOW GRANTS FOR 'user7'@'localhost';

Kết quả sẽ hiển thị tất cả các quyền mà người dùng user7 đã được cấp.

10. Thu hồi quyền (REVOKE)

Nếu bạn muốn thu hồi các quyền đã cấp, bạn có thể sử dụng câu lệnh REVOKE.

Ví dụ:

Thu hồi quyền SELECT từ người dùng user7 trên cơ sở dữ liệu sales:

REVOKE SELECT ON sales.* FROM 'user7'@'localhost';

11. Cấp quyền cho nhiều người dùng

Bạn có thể cấp quyền cho nhiều người dùng trong cùng một câu lệnh.

Ví dụ:

Cấp quyền SELECTINSERT cho cả user8user9 trên bảng orders:

GRANT SELECT, INSERT ON shop.orders TO 'user8'@'localhost', 'user9'@'localhost';


Tổng kết cấp quyền:

  • GRANT là câu lệnh được sử dụng để cấp quyền cho người dùng hoặc nhóm người dùng trong MySQL.
  • Các quyền có thể được cấp ở nhiều cấp độ: toàn bộ hệ thống, cơ sở dữ liệu, bảng, cột, hoặc thậm chí cấp độ thủ tục và hàm.
  • WITH GRANT OPTION cho phép người dùng cấp quyền cho người dùng khác.
  • Quyền có thể được giới hạn dựa trên địa chỉ máy chủ hoặc IP.
  • Để thu hồi quyền, bạn sử dụng câu lệnh REVOKE.

Với những thông tin trên, bạn có thể quản lý và phân quyền người dùng trong MySQL một cách chi tiết và hiệu quả.

12. Ví dụ cấp quyền nâng cao trong MySQL

Các ví dụ cấp quyền nâng cao sẽ tập trung vào việc kiểm soát chi tiết và chuyên sâu hơn, bao gồm việc cấp quyền trên nhiều cấp độ đối tượng khác nhau, phân quyền cho cột và điều khiển truy cập nâng cao.

12.1. Cấp quyền chỉ cho một số bảng trong cơ sở dữ liệu

Bạn có thể cấp quyền cho một người dùng chỉ trên một số bảng cụ thể trong một cơ sở dữ liệu. Ví dụ, nếu bạn muốn cấp quyền SELECTINSERT cho người dùng user1 chỉ trên bảng employeesdepartments trong cơ sở dữ liệu

GRANT SELECT, INSERT ON company.employees TO 'user1'@'localhost';
GRANT SELECT, INSERT ON company.departments TO 'user1'@'localhost';

Trong ví dụ này, người dùng user1 chỉ có quyền đọc và chèn dữ liệu vào các bảng employeesdepartments trong cơ sở dữ liệu company.

12.2. Cấp quyền cho các cột cụ thể trong bảng

Trong nhiều trường hợp, bạn muốn giới hạn quyền truy cập của người dùng chỉ trên một số cột cụ thể thay vì toàn bộ bảng. Điều này thường được sử dụng để tăng cường bảo mật dữ liệu.

Ví dụ:

Cấp quyền SELECT cho người dùng user2 chỉ trên các cột first_name, last_name trong bảng employees của cơ sở dữ liệu company:

GRANT SELECT (first_name, last_name) ON company.employees TO 'user2'@'localhost';

Người dùng user2 sẽ chỉ có thể xem dữ liệu từ các cột first_namelast_name, không có quyền truy cập vào các cột khác trong bảng employees.

12.3. Cấp quyền EXECUTE cho các thủ tục lưu trữ (Stored Procedures)

Trong trường hợp bạn muốn cấp quyền cho người dùng thực hiện các thủ tục lưu trữ (stored procedures) hoặc hàm (functions), bạn cần cấp quyền EXECUTE.

Ví dụ:

Cấp quyền EXECUTE cho người dùng user3 trên tất cả các thủ tục và hàm trong cơ sở dữ liệu sales:

GRANT EXECUTE ON PROCEDURE sales.* TO 'user3'@'localhost';

Người dùng user3 giờ đây có thể thực hiện tất cả các thủ tục và hàm trong cơ sở dữ liệu sales.

12.4. Cấp quyền GRANT OPTION cho phép người dùng cấp quyền lại

Trong một số tình huống, bạn muốn một người dùng có thể cấp quyền cho người dùng khác. Điều này được thực hiện thông qua tùy chọn WITH GRANT OPTION.

Ví dụ:

Cấp quyền ALL PRIVILEGES cho người dùng admin1 và cho phép họ cấp quyền lại cho người khác trên cơ sở dữ liệu company:

GRANT ALL PRIVILEGES ON company.* TO 'admin1'@'localhost' WITH GRANT OPTION;

Người dùng admin1 không chỉ có toàn bộ quyền trên cơ sở dữ liệu company mà còn có thể cấp các quyền này cho những người dùng khác.

12.5. Giới hạn quyền truy cập dựa trên địa chỉ IP

Bạn có thể hạn chế quyền của người dùng chỉ từ một địa chỉ IP hoặc dải địa chỉ IP nhất định. Điều này giúp tăng cường bảo mật, chỉ cho phép truy cập từ những địa chỉ cụ thể.

Ví dụ:

Cấp quyền SELECT cho người dùng user4 chỉ khi họ truy cập từ địa chỉ IP 192.168.1.50:

GRANT SELECT ON *.* TO 'user4'@'192.168.1.50';

Người dùng user4 chỉ có thể thực hiện truy vấn SELECT khi truy cập từ địa chỉ IP 192.168.1.50.

12.6. Cấp quyền truy cập theo vai trò (Role-based permissions)

MySQL 8.0 trở lên hỗ trợ khái niệm về vai trò (roles), giúp bạn quản lý các quyền dễ dàng hơn bằng cách gán nhiều quyền vào một vai trò, sau đó gán vai trò đó cho người dùng.

Bước 1: Tạo một vai trò
CREATE ROLE 'manager';

Bước 2: Gán quyền cho vai trò
GRANT SELECT, INSERT, UPDATE ON company.* TO 'manager';

Bước 3: Gán vai trò cho người dùng
GRANT 'manager' TO 'user5'@'localhost';

Giờ đây, người dùng user5 có tất cả các quyền liên quan đến vai trò manager, bao gồm quyền SELECT, INSERT, và UPDATE trên cơ sở dữ liệu company.

12.7. Cấp quyền chỉ đọc (Read-only)

Bạn có thể tạo một người dùng chỉ có quyền đọc (read-only), nghĩa là họ chỉ có thể thực hiện các câu lệnh SELECT mà không có quyền thay đổi dữ liệu.

Ví dụ:

Cấp quyền chỉ đọc cho người dùng user6 trên cơ sở dữ liệu inventory:

GRANT SELECT ON inventory.* TO 'user6'@'localhost';

Người dùng user6 chỉ có thể đọc dữ liệu từ tất cả các bảng trong cơ sở dữ liệu inventory, mà không có quyền sửa đổi.

12.8. Thu hồi quyền truy cập (REVOKE)

Bạn có thể thu hồi các quyền đã cấp cho một người dùng bằng cách sử dụng câu lệnh REVOKE.

Ví dụ:

Thu hồi quyền INSERT của người dùng user7 trên bảng orders trong cơ sở dữ liệu shop:

REVOKE INSERT ON shop.orders FROM 'user7'@'localhost';

Sau khi thu hồi, người dùng user7 sẽ không còn quyền chèn dữ liệu vào bảng orders nữa.

12.9. Cấp quyền sử dụng kết nối SSL

Trong những môi trường yêu cầu bảo mật cao, bạn có thể giới hạn quyền truy cập của người dùng chỉ khi họ sử dụng kết nối SSL.

Ví dụ:

Cấp quyền SELECT cho người dùng user8 chỉ khi họ kết nối thông qua SSL:

GRANT SELECT ON *.* TO 'user8'@'localhost' REQUIRE SSL;

Người dùng user8 sẽ chỉ có thể truy cập dữ liệu nếu họ sử dụng kết nối bảo mật SSL.

12.10. Cấp quyền cho người dùng tạm thời

Bạn có thể giới hạn quyền của người dùng trong một khoảng thời gian cụ thể bằng cách sử dụng lệnh CREATE USER với các tùy chọn giới hạn thời gian truy cập.

Ví dụ:
CREATE USER 'temp_user'@'localhost' IDENTIFIED BY 'password' WITH MAX_CONNECTIONS_PER_HOUR 500;
GRANT ALL PRIVILEGES ON project_db.* TO 'temp_user'@'localhost';

Người dùng temp_user sẽ có quyền truy cập đầy đủ vào cơ sở dữ liệu project_db, nhưng bị giới hạn số kết nối tối đa mỗi giờ là 500, và có thể kết nối trong thời gian quy định.