User 1412239 là Giám Đốc
Những User : 1412193, 1412176, 1412195, ... (có rất nhiều Trưởng chi nhánh nhưng tụi em liệt kê 1 số ra) là các Trưởng chi nhánh
Những User : 1412200 (P.NS), 1412001(P.KT), 1412002(P.KH), ... là các Trưởng phòng
Những User : là các Trưởng đề án
Những User : 1412186, 1412192, 1412200,1412201,1412202,1412203,1412204,1412205, ... , 1412213 là các Nhân viên bình thường
create user NV401 identified by 123;
create role giamdoc;
create role truongphong;
create role truongchinhanh;
create role truongduan;
create role nhanvien;
GRANT GIAMDOC to “1412239”;
Ta sử dụng role TRUONGPHONG đã được tạo từ policy 2, ta gán quyền Gán quyền update và insert cho role TRUONGPHONG trên bảng DuAn như sau :
Lưu ý : việc viết thường hay hoa trong oracle không hề quan trọng (nền thầy đừng thắc mắc em đã test rồi)
GRANT INSERT,UPDATE ON HR.DUAN TO TRUONGPHONG;
Policy 4: Giám đốc được phép xem thông tin dự án gồm (mã dự án, tên dự án, kinh phí, tên phòng chủ trì, tên chi nhánh chủ trì, tên trưởng dự án và tổng chi) (DAC).
cách để tạo view DUAN_CN : sử dụng các bảng DuAn , PhongBan , ChiNhanh , NhanVien , ChiTieu và group by trên các trưởng (maDA, tenDA, kinhphi, tenPhong, tenCN, hoTen) sau đó ta sum(soTien) là sẽ ra được yêu cầu đề bài
create view DUAN_CN
as select maDA, tenDA, kinhphi, tenPhong, tenCN, hoTen, sum(soTien) as Tongchi
from DuAn a, PhongBan b, ChiNhanh c, NhanVien d, ChiTieu e
where a.phongChuTri = b.maPhong and b.chiNhanh = c.maCN and a.TruongDA = d.manv and a.maDA = e.duAN
group by maDA, tenDA, kinhphi, tenPhong, tenCN, hoTen
grant select on DUAN_CN to GIAMDOC;
Policy 5: Chỉ trưởng phòng, trưởng chi nhánh được cấp quyền thực thi stored procedure cập nhật thông tin phòng ban của mình (DAC).
Cấu trúc SP này ra sao : SP có chức năng kiểm tra các phòng ban của trưởng phòng và trưởng chi nhánh
Cách làm : ta sẽ có 2 biến (checking vs checking1) 2 biến này có nhiệm vụ kiểm tra có phải phòng đó không theo Trưởng phòng (checking) và 1 biến cũng kiểm tra phòng đó không nhưng của trưởng chi nhánh (checling1) và sau đó ta giao lại nếu là 1 số != 0 thì ta sẽ cho phép update ta cùng có code sau để hiểu thêm
select count(*) into checking from PHONGBAN where TRUONGPHONG = user and MAPHONG = MP;
select count(*) into checking1 from CHINHANH a, PHONGBAN b where a.TRUONGCHINHANH = user and a.MACN = b.CHINHANH and b.MAPHONG = MP;
IF (checking <= 0 and checking1 <= 0) THEN rollback; return; END IF;
Tạo procedure có tên là UpdatePhongBan5d, trong đó dữ liệu đầu vào sẽ là mã phòng cần cập nhật (MP), tên phòng cập nhật (TP), số lượng nhân viên mà mình mong muốn cập nhật (SNV) và ngày nhận chức (NNC).
CREATE OR REPLACE Procedure UpdatePhongBan5d
GRANT EXECUTE ON UpdatePhongBan5d TO TRUONGPHONG;
GRANT EXECUTE ON UpdatePhongBan5d TO TRUONGCHINHANH;
Policy 6: Tất cả nhân viên bình thường (trừ trưởng phòng, trưởng chi nhánh và các trưởng dự án) chỉ được phép xem thông tin nhân viên trong phòng của mình, chỉ được xem lương của bản thân (VPD).
Giải pháp: Tạo ra 2 function (nhanvien_vpd1, nhanvien_vpd2) tương ứng cho 2 policy (nhanvien_vpd1s, nhanvien_vpd2s)
select count(*) into usersx from PHONGBAN where TRUONGPHONG = user;
if (usersx > 0) then return ''; end if;
select count(*) into usersx from CHINHANH where TRUONGCHINHANH = user;
if (usersx > 0) then return ''; end if;
select count(*) into usersx from DUAN where TRUONGDA = user;
if (usersx > 0) then return ''; end if;
*Nếu trải qua hết thì thực hiện trả về như sau : *
select maPhog into phongban from NHANVIEN where manv = user;
return 'maPhog = ' || q'[']'|| phongban || q'[']';
return 'MANV = ' || user;
Giải pháp: Tạo ra vpd_chitieu_duan1 : kết với bảng DUAN để có thể lấy ra các thông tin của trương chi nhánh đó nếu kiểm tra hoàn tất thì có thể xem nếu là trưởng dự án ta sẽ chỉ trả về các chi tiêu
select count(*) into usersx from PHONGBAN where TRUONGPHONG = user;
if (usersx > 0) then return ''; end if;
select count(*) into usersx from CHINHANH where TRUONGCHINHANH = user;
if (usersx > 0) then return ''; end if;
*Nếu trải qua hết thì thực hiện trả về như sau : *
return 'EXISTS(select * from DUAN where MADA = DUAN and TRUONGDA = ' || user || ')';
Policy 8: Trưởng phòng chỉ được phép đọc thông tin chi tiêu của dự án trong phòng ban mình quản lý. Với những dự án không thuộc phòng ban của mình, các trưởng phòng được phép xem thông tin chi tiêu nhưng không được phép xem số tiền cụ thể (VPD).
Giải pháp: Tạo ra vpd_chitieu_hidden_sotien1 : mục tiêu khi đã kiểm tra 1 loạt các vấn đề ở trên xem nó có phải là user đúng như yêu cầu hay không thì ta kết hợp với PHONGBAN, để lấy mã phòng ban của thằng mình đó , và dự án xem xem PB nó đang có những dự án nào
select count(*) into usersx from PHONGBAN where TRUONGPHONG = user;
if (usersx > 0) then return 'EXISTS(select * from PHONGBAN , DUAN where DUAN = MADA and MAPHONG = PHONGCHUTRI and TRUONGPHONG = ' || user || ')'; end if; return '';
ý nghĩa của câu return trên : trả về những chi tiêu mà phòng ban mà thằng đó quản lý cũng như là check TRUE và FALSE cho từng dòng dữ liệu sau đây là gán policy vô cùng quan trọng (bắt buộc phải có sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS để hiện thị ra những thông tin được đánh FALSE nhưng những thông tin này sẽ được ẩn đi cột lương)
BEGIN SYS.DBMS_RLS.ADD_POLICY( object_schema => 'hr', object_name => 'CHITIEU', policy_name => 'chitieu_vpd2s', function_schema => 'hr', policy_function => 'vpd_chitieu_hidden_sotien1', sec_relevant_cols => 'SOTIEN', sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS); END;