Quản lý quyền truy cập của người dùng trong Microsoft SQL Server
1. Phân quyền (GRANT)
Câu lệnh GRANT dùng để cấp một hoặc nhiều quyền cho một User, Role (Vai trò) hoặc Application Role trên một đối tượng cơ sở dữ liệu (Table, View, Stored Procedure, v.g.).
Cú pháp cơ bản:
SQL
GRANT quyen_1, quyen_2, ...
ON ten_doi_tuong
TO ten_user_hoac_role;
Các quyền phổ biến:
-
SELECT: Cho phép đọc dữ liệu. -
INSERT: Cho phép thêm dữ liệu mới. -
UPDATE: Cho phép chỉnh sửa dữ liệu. -
DELETE: Cho phép xóa dữ liệu. -
EXECUTE: Cho phép chạy Stored Procedure hoặc Function.
Ví dụ thực tế:
-
Cấp quyền xem bảng
SQLNhanViencho userNV_Kế Toán:GRANT SELECT ON NhanVien TO [NV_KeToan]; -
Cấp nhiều quyền (
SQLSELECT,INSERT,UPDATE) trên bảngSanPhamcho một Role tênQuanLyKho:GRANT SELECT, INSERT, UPDATE ON SanPham TO [QuanLyKho];
2. Thu hồi quyền (REVOKE)
Câu lệnh REVOKE dùng để hủy bỏ một quyền đã được cấp trước đó (GRANT) cho user hoặc role.
Cú pháp cơ bản:
SQL
REVOKE quyen_1, quyen_2, ...
ON ten_doi_tuong
FROM ten_user_hoac_role;
Ví dụ thực tế:
-
Thu hồi quyền
SQLINSERTtrên bảngSanPhamtừ userNV_KeToan:REVOKE INSERT ON SanPham FROM [NV_KeToan];
3. Từ chối quyền (DENY)
Khác với REVOKE (chỉ đơn giản là hủy bỏ quyền đã cấp), câu lệnh DENY dùng để chặn tuyệt đối quyền đó. Khi một quyền đã bị DENY, user hoặc role đó sẽ không thể nhận được quyền đó ngay cả khi họ được thêm vào một Role có quyền đó (vì DENY có độ ưu tiên cao nhất trong SQL Server).
Cú pháp cơ bản:
SQL
DENY quyen_1, quyen_2, ...
ON ten_doi_tuong
TO ten_user_hoac_role;
Ví dụ thực tế:
-
Chặn hoàn toàn quyền
SQLDELETEtrên bảngKhachHangđối với userNV_Sale:DENY DELETE ON KhachHang TO [NV_Sale];
(Để gỡ bỏ trạng thái DENY, bạn dùng lệnh REVOKE ... FROM ...)
4. Tóm tắt phân cấp ưu tiên quyền
Khi SQL Server kiểm tra quyền của một user trên một đối tượng, thứ tự ưu tiên được tính như sau:
-
DENY: Nếu bị từ chối ở bất kỳ cấp độ nào (User hoặc Role mà user đó tham gia), user đó sẽ mất quyền ngay lập tức.
-
GRANT / REVOKE: Các quyền được cấp phép cụ thể.
💡 Mẹo quản trị: Thay vì phân quyền trực tiếp cho từng User (rất khó quản lý khi hệ thống lớn), bạn nên tạo các Database Role (ví dụ:
Role_KeToan,Role_NhanSu), gán quyền cho Role đó, sau đó chỉ cần thêm User vào Role tương ứng.

