policy_04_1412107 - ATBMHTTT-2017/lab01-1412107 GitHub Wiki
- Tạo 1 role
ROLE_NHANVIEN_THUONGchứa tất cả nhân viên bình thường.
create role ROLE_NHANVIEN_THUONG;
- Cấp quyền select trên bảng
NHANVIENcho role này. Gán các nhân viên bình thường tới role.
grant select on NHANVIEN to ROLE_NHANVIEN_THUONG;grant ROLE_NHANVIEN_THUONG to NS001, KH001, DA001, KD001, TT001;
- Tiếp theo, ta tạo hàm chính sách
FUNCTION_XEM_THONGTIN_NHANVIEN. Hàm này trả về ngữ cảnh: khi người dùng đăng nhập vào thì người dùng này phải là nhân viên bình thường.
USER := SYS_CONTEXT('USERENV','SESSION_USER');if USER in ('NS001', 'KH001', 'DA001', 'KD001', 'TT001') thenTEMP := 'MANV = ''' || SYS_CONTEXT('USERENV','SESSION_USER')||'''';-
`RETURN TEMP;` ELSERETURN '';END IF;
- Gán hàm chính sách trên vào bảng
NHANVIEN. Câu lệnh cho phép làSELECT, cột áp dụng làLUONG. Gán như vậy là để mỗi nhân viên bình thường chỉ được xem cột LUONG của chính mình.
BEGINdbms_rls.add_policy(object_schema => 'sysadmin_lab01',object_name => 'NHANVIEN',policy_name => 'PO4',function_schema => 'sysadmin_lab01',policy_function => 'FUNCTION_XEM_THONGTIN_CANHAN',statement_types => 'SELECT',sec_relevant_cols => 'LUONG',update_check => TRUE);END;
- Như vậy, khi đăng nhập bằng 1 trong các tài khoản:
NS001, KH001, DA001, KD001, TT001(là nhân viên thường),
nếu thực thi câu lệnh:
select MANV, HOTEN, DIACHI, DIENTHOAI, EMAIL, MAPHG, CHINHANH, MATKHAU from sysadmin_lab01.NHANVIEN;
- kết quả trả ra là tất cả dữ liệu của bảng
NHANVIEN, nhưng không thấy cộtLUONG
nếu thực thi câu lệnh:
select * from sysadmin_lab01.NHANVIEN;
- kết quả trả ra là 1 dòng dữ liệu của nhân viên thường, có cột
LUONG