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 NhanVien cho user NV_Kế Toán:

    SQL

     

    GRANT SELECT ON NhanVien TO [NV_KeToan];
    
  • Cấp nhiều quyền (SELECT, INSERT, UPDATE) trên bảng SanPham cho một Role tên QuanLyKho:

    SQL

     

    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 INSERT trên bảng SanPham từ user NV_KeToan:

    SQL

     

    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 DELETE trên bảng KhachHang đối với user NV_Sale:

    SQL

     

    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:

  1. 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.

  2. 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.