policy_04_1412107 - ATBMHTTT-2017/lab01-1412107 GitHub Wiki

  1. Tạo 1 role ROLE_NHANVIEN_THUONG chứa tất cả nhân viên bình thường.
  • create role ROLE_NHANVIEN_THUONG;
  1. Cấp quyền select trên bảng NHANVIEN cho 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;
  1. 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') then
  • TEMP := 'MANV = ''' || SYS_CONTEXT('USERENV','SESSION_USER')||'''';
  •  `RETURN TEMP;`
    
  • ELSE
  • RETURN '';
  • END IF;
  1. 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.
  • BEGIN
  • dbms_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;
  1. 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ột LUONG
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

Như vậy, ta đã thực hiên xong chính sách 4-VPD