GRANT SELECT ON VIEW: Cho user chỉ xem view, không xem table gốc
Cấp quyền trên đối tượng VIEW thay vì TABLE để giới hạn truy cập dữ liệu nhạy cảm (che cột, lọc hàng).
Cú pháp
GRANT SELECT ON tenDatabase.tenView TO 'tenUser'@'host';
Các bước thực hiện
- Xem danh sách view trong database:
SHOW FULL TABLES IN tenDatabase WHERE TABLE_TYPE LIKE 'VIEW'; - Xem user hiện có:
SELECT user, host FROM mysql.user; - Cấp quyền:
GRANT SELECT ON test.viewemployeeidandemployeename TO 'Adam Smith'@'localhost';
Kết quả kiểm tra
+-------------------------------+------------+
| Tables_in_test | Table_type |
+-------------------------------+------------+
| empidandempname_view | VIEW |
| empinfoview | VIEW |
| lookuptable | VIEW |
| view_student | VIEW |
| viewemployeeidandemployeename | VIEW |
+-------------------------------+------------+
User 'Adam Smith'@'localhost' giờ chỉ có SELECT trên view viewemployeeidandemployeename, không thể SELECT trực tiếp bảng gốc.
Tại sao dùng View để kiểm soát truy cập?
- Column masking: View chỉ expose cột an toàn (ẩn password, salary, PII).
- Row-level security: View có WHERE lọc theo user/department.
- Đơn giản hóa: User không cần biết join phức tạp.
- Audit: Dễ theo dõi ai truy cập view nào.
Lưu ý
- User phải có quyền
SELECTtrên view. Không cần quyền trên table gốc (MySQL kiểm tra quyền view owner - DEFINER). - View có
DEFINERvàSQL SECURITY DEFINER(mặc định) → chạy với quyền của creator. User chỉ cần quyền trên view. - Thu hồi quyền:
REVOKE SELECT ON test.viewname FROM 'user'@'host';