ự
ố
Bài th c hành s 6
VIRTUAL PRIVATE DATABASE (1)
ắ ộ
Tóm t
t n i dung:
(cid:0) ớ ệ ề Gi i thi u v Virtual Private Database
(cid:0) Rowlevel security
(cid:0) ậ ỹ ệ ớ K thu t làm vi c v i policy function
ớ
ệ
I. Gi
i thi u chung
ữ ệ ụ ề ệ ả ậ ằ Trong nhi u năm dài, vi c áp d ng các chính sách b o m t cho d li u n m trong các
ượ ệ ử ụ ự ệ ằ ớ ả b ng CSDL đ c hi n th c b ng vi c s d ng view cùng v i các function. Tuy nhiên
ự ệ ề ể ộ ả ự ế ụ cách hi n th c này nhi u khi không th là m t gi i pháp th c t ặ cho m c đích trên, đ c
ệ ữ ệ ự ứ ệ ầ ả ộ bi t khi c n th c hi n b o m t ấ ậ ở m c đ “dòng d li u” (rowlevel security). Th y
ượ ủ ầ ườ ừ đ c nhu c u ngày càng cao c a ng i dùng, t Oracle Database 8.1.5, Oracle đã gi ớ i
ệ ớ ấ ệ ệ ả ộ ừ ọ ắ thi u m t công ngh m i r t hi u qu là Virtual Private Database (t đây g i t t là
VPD).
ậ ỹ ự ế ợ ủ VPD là s k t h p c a 2 k thu t:
Finegrained access control (FGAC): cho phép ng
ườ ả ị i qu n tr dùng các function đ ể
ự ệ ả ậ ả ậ ớ ế hi n th c các chính sách b o m t và liên k t các chính sách b o m t đó v i các table,
ư ậ ữ ệ ế ặ ườ view ho c synonym. Vi c gán các chính sách nh v y khi n cho nh ng ng i dùng
ẽ ấ ề ạ ượ ữ ớ v i quy n h n khác nhau s th y đ ố ớ ố c nh ng “khung nhìn” khác nhau đ i v i đ i
ượ ệ ả ớ ạ ố ố ớ ẽ ọ ượ t ng đ ệ c b o v . Vi c gi i h n khung nhìn này s trong su t đ i v i m i ng ườ i
ẽ ượ ả ậ ồ ờ ấ ỳ ụ dùng. Đ ng th i chính sách b o m t đó s đ c áp d ng cho b t k user nào truy
ấ ế ầ ườ ừ ả ả ị xu t đ n table đó mà không c n ng i qu n tr ph i gán chính sách cho t ng user.
ậ ượ ề ế ả ự ằ ệ ễ ả Đi u này khi n các chính sách b o m t đ ơ c hi n th c b ng FGAC d qu n lý h n
ệ ự ằ khi hi n th c b ng view.
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ộ ơ ư ữ ả ữ ấ ậ ị ữ ả Application Context: cung c p m t n i l u tr b o m t cho nh ng giá tr ng c nh
ứ ệ ủ ả ự ử ụ ụ ệ ẽ ng d ng. S d ng Application Context s nâng cao hi u qu th c hi n c a FGAC
ươ ọ ề (trong ch ng trình chúng ta không h c v Applicationcontext).
ở ươ ệ ả ổ ế ể ệ ự ệ ả L u ýư : b i vì đây là 1 ph ng pháp hi u qu và ph bi n đ hi n th c vi c b o m t ậ ở
ữ ệ ứ ườ ườ ậ ữ Rowlevel security m c dòng d li u trong Oracle, nên ng i ta th ng dùng thu t ng
ể (RLS) đ thay cho Finegrained access control ho c ặ Virtual Private Database.
II. Rowlevel Security
A. Lý thuy tế
1.
Rowlevel Security
Rowlevel security (RLS) cho phép gi
ớ ạ ệ ấ i h n vi c truy xu t các hàng (record)
ậ ộ ượ ự ằ ệ ả ự d a trên m t chính sách b o m t (security policy) đ c hi n th c b ng PL/SQL.
ả ậ ộ ả ả ấ ị M t chính sách b o m t mô t ệ các quy đ nh qu n lý vi c truy xu t các dòng d ữ
li u.ệ
ệ ơ ế ự 2. C ch th c hi n
Đ th c hi n RLS, đ u tiên ta t o 1 hàm PL/SQL (PL/SQL function) tr
ể ự ệ ầ ạ ả ề v
ệ ủ ề ả ộ ỗ ỗ ậ ứ m t chu i (string). Chu i string này ch a các đi u ki n c a chính sách b o m t
ự ệ ố mà ta mu n hi n th c.
Hàm PL/SQL v a đ
ừ ượ ạ ở ượ c t o trên sau đó đ c đăng ký cho các table, view mà
ệ ằ ả ố ta mu n b o v b ng cách dùng package PL/SQL DBMS_RLS.
ấ ỳ ố ượ ấ ộ ượ ủ Khi có m t câu truy v n c a b t k user nào trên đ i t ng đ ệ ả c b o v ,
ỗ ượ ả ề ừ ủ ệ ề ẽ ố Oracle s n i chu i đ c tr v t hàm nêu trên vào m nh đ WHERE c a câu
ế ệ ệ ề ầ ầ ệ l nh SQL ban đ u (n u trong câu l nh SQL ban đ u không có m nh đ WHERE
ẽ ự ộ ể ư ệ ề ề ệ ạ ỗ thì Oracle s t đ ng t o thêm m nh đ WHERE đ đ a chu i đi u ki n vào),
ẽ ọ ượ ờ ệ ủ ữ ệ ậ ả nh đó s l c đ ề c các hàng d li u theo các đi u ki n c a chính sách b o m t.
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
3. Các l u ý khi làm vi c v i RLS
ệ ớ ư
Các hàm PL/SQL đ
ượ ằ ọ c đăng ký cho các table, view hay synonym b ng cách g i
ủ ụ th t c DBMS_RLS.ADD_POLICY.
Th t c ADD_POLICY đòi h i ít nh t ph i có 3 tham s
ủ ụ ấ ả ỏ ố ậ nh p vào:
ả ế ủ object_name, policy_name, policy_function. (Mô t chi ti t c a package
DBMS_RLS đ ượ c ứ ch a trong file
ư ụ ặ th _m c_cài_đ t_Oracle\Oracle\RDBMS\ADMIN\dbmsrlsa.sql).
S k t h p c a object_schema, object_name, và policy_name ph i là duy nh t.
ự ế ợ ủ ấ ả
M c đ nh, policy s đ
ặ ị ẽ ượ ấ ả ệ ườ ả ị ụ c áp d ng cho t t c các l nh DML. Ng i qu n tr có
ụ ể ể ạ ố ỉ th dùng tham s STATEMENT_TYPES đ ch ra policy áp d ng cho lo i câu
ệ l nh nào.
ấ ứ ự ế ế ấ ộ B t c khi nào 1 user truy xu t m t cách tr c ti p hay gián ti p vào đ i t ố ượ ng
ượ ả ẽ ượ ọ ệ ộ đ c b o v , RLS engine s đ ố c g i m t cách trong su t, hàm PL/SQL đã đăng
ẽ ượ ồ ệ ẽ ượ ự ủ ử ự ỉ ký s đ c th c thi, và r i l nh SQL c a user s đ c ch nh s a và th c thi.
Tuy nhiên, account SYS không b nh h
ị ả ưở ở ấ ỳ ả ậ ng b i b t k chính sách b o m t
nào.
ố ượ ụ ề ể Nhi u policy cũng có th áp d ng cho cùng 1 đ i t ẽ ế ng. Khi đó CSDL s k t
ạ ớ ợ ấ ả h p t t c các policy đó l i v i nhau theo phép AND.
Quy n s d ng package DBMS_RLS không đ
ử ụ ề ượ ọ ườ c gán cho m i ng i dùng.
ữ ườ ị ầ ả ượ ề ể Nh ng ng i qu n tr c n đ c gán quy n EXECUTE ON DBMS_RLS đ có
ượ ể ử ụ th s d ng đ c nó.
T t c các policy function mà ta t o ra đ u ph i có đúng 2 tham s truy n vào.
ấ ả ề ề ạ ả ố
ở ữ ố ầ ố ượ ủ Tham s đ u tiên là tên c a schema s h u đ i t ả ng mà chính sách RLS đó b o
ủ ố ượ ố ứ ượ ả ệ ố ệ v . Tham s th hai là tên c a đ i t ng đ ấ ữ c b o v . Hai tham s này r t h u
ể ượ ố ượ ụ ề ích vì 1 policy function có th đ c áp d ng cho nhi u đ i t ng khác nhau trong
ể ượ ủ ề ố ặ ả nhi u schema khác nhau. Tên c a các tham s có th đ ư c đ t tho i mái nh ng
ứ ự ủ ứ ự ủ ố ố ẽ ượ th t ả c a 2 tham s ph i tuân th theo th t trên. Các tham s s đ c dùng
ố ượ ượ ủ ể ọ ị ể đ xác đ nh đ i t ng nào mà chính sách đó đ c g i cho nó. Ki u c a 2 tham
ủ ề ể ả ị ả ề ố s truy n vào và c a giá tr tr v ph i là ki u VARCHAR2.
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
Policy function c n đ
ầ ượ ạ ủ ườ ị ả ả c t o ra trong schema c a ng ậ i qu n tr b o m t.
ề ệ ấ ầ ọ ượ Đi u này quan tr ng vì vi c truy xu t vào các policy function c n đ ệ ả c b o v .
ự ề ề ề ặ Các user khác không nên có quy n th c thi hay quy n alter ho c quy n drop trên
các policy function này.
Đ hi n th c đ
ể ệ ự ượ ệ ả ậ ả ộ ứ ạ c các chính sách b o m t ph c t p m t cách hi u qu , thông
ườ ườ ế ợ ử ụ ớ ờ th ng ng i ta s d ng k t h p RLS v i Application Context. Nh đó các chính
ậ ẽ ượ ả ạ ơ ụ ụ ề ệ sách b o m t s đ ụ c áp d ng theo các đi u ki n linh ho t h n (ví d : áp d ng
ự ả ườ ố ấ ộ ậ chính sách b o m t nào là d a trên ng i dùng thu c Department s m y). Trong
ươ ọ ề ự ủ ch ng trình th c hành c a chúng ta không h c v Application Context, sinh viên
ề ấ ể ề ự t tìm hi u thêm v v n đ này.
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ự B. Th c hành
ả ử ả ậ ộ ị Gi ộ s ta có m t chính sách b o m t (security policy) quy đ nh không m t
ườ ượ ấ ế ng i dùng nào đ ộ c truy xu t đ n các record thu c Department có deptno là 10
ủ ể ể ả ộ ụ trong b ng EMP thu c schema c a user SCOTT. Đ chính sách này có th áp d ng
ỗ ả ề ầ ạ ề ầ ệ ủ cho CSDL, đ u tiên ta c n t o 1 PL/SQL function có chu i tr v là đi u ki n c a
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION no_dept10 (
p_schema IN VARCHAR2,
p_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'deptno != 10';
END;
/
Function created.
ậ ả chính sách b o m t trên:
ự ệ ạ ả ầ ậ Sau khi t o function hi n th c chính sách b o m t, ta c n đăng ký function đó
ố ượ ệ ằ ố cho đ i t ủ ụ ả ng mà chính sách đó mu n b o v b ng cách dùng th t c
sec_mgr@KNOX10g> BEGIN
DBMS_RLS.add_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'quickstart',
policy_function => 'no_dept10');
END;
/
PL/SQL procedure successfully completed.
ADD_POLICY trong package DBMS_RLS.
ướ ậ ừ ự ệ ả ở ượ c hi n th c chính sách b o m t v a trình bày trên nên đ ự c th c Hai b
ụ ệ ề ả ả ậ ả ệ ị hi n b i ở account ch u trách nhi m v qu n lý b o m t (trong ví d này và c các ví
ệ ả ả ậ ị ụ d khác trong bài lab, account ch u trách nhi m qu n lý b o m t là sec_mgr).
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ể ể ầ ượ ệ Đ ki m tra xem chính sách này có làm vi c không, ta l n l t log on vào các
ấ ả ộ ệ ệ ằ account sec_mgr và SCOTT truy xu t b ng EMP b ng m t l nh DML. Câu l nh sau
ể ầ ị ấ ả ẽ s yêu c u hi n th ra t ả t c các Department có trong b ng. Tuy nhiên, cho dù log on
ẽ ấ ằ ẽ ằ vào account nào ta cũng s th y r ng các Department có deptno b ng 10 s không
ế ả ở ự ộ ọ xu t hiấ ữ đ ng l c ra nh ng ấ ện trong k t qu câu truy v n, b i vì chính sách RLS đã t
sec_mgr@KNOX10g> SELECT DISTINCT deptno FROM scott.emp;
DEPTNO
----------
20
30
scott@KNOX10g> SELECT DISTINCT deptno FROM emp;
DEPTNO
----------
20
30
record đó.
ổ ộ ộ ư ủ ữ ủ ể ả ể M t u đi m c a RLS n a là ta có th thay đ i n i dung c a 1 chính sách b o
ậ ằ ự ệ ả ầ m t b ng cách vi ế ạ t l i function hi n th c chính sách đó mà không c n ph i đăng ký
ồ ượ ể ấ ả ầ ượ ư ể ạ l i chính sách đó cho đ i t ệ ng c n b o v . Đ th y đ c u đi m này, ta tr l ở ạ i
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION no_dept10 (
p_schema IN VARCHAR2,
p_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'USER != ''SCOTT''';
END;
/
Function created.
ổ ộ ủ ụ ớ v i ví d trên, thay đ i n i dung c a function no_dept10:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ừ ượ ử ổ ườ Chính sách v a đ ị c s a đ i quy đ nh không cho ng ấ i dùng SCOTT truy xu t
ả ượ ủ ệ ả ộ ả ề ủ ộ n i dung c a b ng đ c b o v (USER là m t hàm c a Oracle tr v tên ng ườ i
ệ ạ ủ ể ạ ụ ệ dùng hi n t i c a session đó). Ta ki m tra l i xem vi c áp d ng chính sách đã đ ượ c
ầ ượ ư ằ ổ ệ ố ằ thay đ i ch a b ng cách l n l t log on vào h th ng b ng 2 account sec_mgr,
sec_mgr@KNOX10g> SELECT COUNT(*) Total_Records FROM scott.emp;
TOTAL_RECORDS
-------------
14
scott@KNOX10g> SELECT COUNT(*) Total_Records FROM emp;
TOTAL_RECORDS
-------------
0
ấ ả SCOTT và truy xu t b ng EMP:
ỗ ả ề ủ ể ể ạ ử Sau khi t o các policy function, ta có th ki m tra chu i tr v c a function v a
sec_mgr@KNOX10g> col predicate format a50;
sec_mgr@KNOX10g> SELECT no_dept10 ('SCOTT','EMP') predicate
FROM DUAL;
PREDICATE
--------------------------------------------------
USER != 'SCOTT'
ự ệ ệ ằ ạ t o b ng cách th c hi n câu l nh sau:
ệ ế ạ ố ị ị ặ N u trong câu l nh t o policy function ta quy đ nh các tham s có giá tr m c
ỗ ả ề ử ệ ở ể ượ ể ể ị đ nh là null thì câu l nh đ ki m tra chu i tr v v a nêu trên có th đ c vi ế t
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION no_dept10 (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
BEGIN
ọ ạ ắ ng n g n l i:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
RETURN 'deptno != 10';
END;
/
sec_mgr@KNOX10g> col predicate format a50;
sec_mgr@KNOX10g> SELECT no_dept10 predicate FROM DUAL;
PREDICATE
--------------------------------------------------
USER != 'SCOTT'
ả ử ỉ ượ ả ậ ị Gi s ta có chính sách b o m t quy đ nh các user ch đ c insert và update trên
ữ ệ ủ ượ ệ các dòng d li u c a các Department có deptno < 4. Policy function đ ự c hi n th c
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION dept_less_4 (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
BEGIN
RETURN 'deptno < 4';
END;
/
Function created.
sec_mgr@KNOX10g>BEGIN
DBMS_RLS.add_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'EMP_IU',
function_schema => 'SEC_MGR',
policy_function => 'dept_less_4',
statement_types => 'INSERT,UPDATE',
update_check => TRUE);
END;
/
ư nh sau:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ả ụ ử ụ ủ Tên chính sách (policy_name) nên mô t m c đích s d ng c a policy function
ụ ằ ỉ ượ này (trong ví d này tên chính sách là EMP_IU ch ra r ng chính sách đ ụ c áp d ng
ụ ả ớ ố ươ ự ệ ọ cho b ng EMP đ i v i các tác v Insert, Update). T ng t , vi c ch n tên
ả ợ ả ề ớ ằ ầ policy_function cũng c n ph i g i nh r ng function đó tr v cái gì.
ạ ệ ố Tham s ọ ố update_check là tham s tùy ch n cho các lo i l nh INSERT và
ị ị ị ặ UPDATE. Nó có giá tr m c đ nh là FALSE. N u ế update_check có giá tr TRUE, sau
ệ ượ ử ề ả ậ ỉ khi câu l nh SQL đã đ ệ ủ c ch nh s a theo đi u ki n c a chính sách b o m t và đ ượ c
ự ẽ ự ệ ể ạ ừ ị th c thi, Oracle s ệ th c hi n vi c ki m tra l i các giá tr v a đ ượ c
ế ả ạ ậ ạ UPDATE/INSERT xem nó có vi ph m chính sách b o m t không. N u có vi ph m
ẽ ấ ạ ự ệ ệ ấ thì vi c th c thi câu l nh SQL đó s th t b i và thông báo l ỗ ẽ ượ i s đ ề c xu t ra. Đi u
ẽ ượ ở ầ này s đ ấ c th y rõ ế ph n ti p theo.
ụ ệ ể ậ ầ ả Ta ki m tra vi c áp d ng chính sách b o m t trên. Đ u tiên ta SELECT trên
ộ ố ậ ằ ấ ộ ả ả b ng EMP m t s record, ta nh n th y r ng ràng bu c ‘deptno < 4’ không nh
scott@KNOX10g> SELECT username, deptno
FROM emp WHERE username < 'C';
USERNAME DEPTNO
---------- ----------
ALLEN 1
BLAKE 2
ADAMS 6
ưở ố ớ ệ h ng đ i v i câu l nh SELECT:
ầ ượ ở ế ả ằ Ti p theo ta update trên b ng EMP l n l t record có deptno b ng 1 và
scott@KNOX10g> UPDATE emp
SET username = 'GRIZZLY'
WHERE username = 'ALLEN';
1 row updated.
scott@KNOX10g> UPDATE emp
SET username = 'BOZO'
ẽ ượ ế ả ư ằ deptno b ng 6 s đ c k t qu nh sau:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
WHERE username = 'ADAMS';
0 rows updated.
ư ằ ỗ ượ ứ ệ ấ ẽ L u ý r ng s không có l i nào đ c xu t ra cho câu l nh update th hai. Vì
ủ ề ệ ệ ả ỏ ồ ờ không có dòng nào trong b ng th a đ ng th i đi u ki n c a câu l nh SQL trên và
ể ệ ượ ư ả ậ ượ đi u ki n đ c đ a ra trong chính sách b o m t nên không có hàng nào đ c update.
scott@KNOX10g> UPDATE emp
SET deptno = 6
WHERE username = 'BLAKE';
update emp
*
ERROR at line 1:
ORA-28115: policy with check option violation
ự ế ệ ệ ẽ ỗ ệ ấ Tuy nhiên, n u ta th c hi n câu l nh sau thì s có thông báo l i xu t hi n:
ệ ầ ượ ệ ỏ Trong câu l nh trên, đ u tiên Oracle tìm đ ề c 1 hàng th a đi u ki n username
ệ ủ ẽ ự ề ậ ệ ả = 'BLAKE' và đi u ki n c a chính sách b o m t là deptno < 4 nên nó s th c hi n
ệ ế ậ ố s update_check = TRUE ư vi c update. Nh ng do ta đã thi t l p tham nên Oracle sẽ
ị ừ ượ ữ ể ị ừ ượ ấ ằ ậ ki m tra nh ng giá tr v a đ c update và nh n th y r ng giá tr v a đ c update vi
ệ ạ ả ậ ổ ị ph m chính sách b o m t deptno < 4 (câu l nh trên đã thay đ i giá tr deptno thành 6
ị ấ ạ ệ ạ ỗ > 4). Do có vi ph m này nên câu l nh update trên b th t b i và có thông báo l ấ i xu t
ừ ồ ẽ ượ ệ ệ ự hi n. N u ế update_check = FALSE thì câu l nh update v a r i s đ c th c thi thành
ủ ẽ ị công (nghĩa là deptno c a BLAKE s có giá tr là 6).
scott@KNOX10g> INSERT INTO emp (username, deptno)
VALUES ('KNOX',1);
1 row created.
scott@KNOX10g> INSERT INTO emp (username, deptno)
VALUES ('ELLISON',5);
insert into emp(username,deptno)
*
ERROR at line 1:
ể ế ườ ả ợ Ta ki m tra ti p tr ng h p khi ta INSERT vào b ng EMP:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ORA-28115: policy with check option violation
ươ ự ư ườ ụ ệ ể ớ ợ T ng t nh tr ng h p khi ta ki m tra v i các l nh Update, tác v insert 1
ị ấ ạ ỗ ấ ạ ụ record có deptno >= 4 b th t b i và sinh ra l ạ i. Tác v này th t b i do vi ph m
ọ policy function và do ta đã thi ủ ụ ế ậ UPDATE_CHECK=TRUE khi g i th t c t l p
ế ế ậ ệ ẽ ADD_POLICY. N u ta không thi t l p TRUE, vi c insert trên s thành công (nghĩa
ẽ ượ ạ là s có thêm 1 dòng có deptno = 5 đ c t o ra).
ệ ớ
ậ
ỹ
III. K thu t làm vi c v i policy function
A. Lý thuy tế
ấ ỳ ữ ệ ả ộ ấ ể M t trong nh ng cách hi u qu nh t đ ngăn không cho b t k record nào b ị
ươ ạ ỗ ả ề ấ ằ truy xu t b ng ph ng pháp RLS là t o ra 1 policy function có chu i tr ứ v ch a
ề ệ ộ ờ ể ả ỗ m t đi u ki n nào đó mà không bao gi ầ ụ có th x y ra (ví d : chu i “1 = 0”). C n
ả ề ế ẽ ằ ặ ằ ộ ỗ ỗ ư l u ý r ng tr v 1 chu i null ho c chu i có đ dài b ng 0 thì s cho k t qu ng ả ượ c
ấ ả ẽ ượ i: ạ t l t c các record s đ ấ . c phép truy xu t
ự B. Th c hành
ẽ ấ ợ ế ặ ấ ả ụ ạ ộ S r t có l i n u ta t o m t policy function có tác d ng ngăn ch n t t c các
ầ ỗ ạ ộ ả ộ record. M i khi c n khóa l i m t b ng nào đó m t cách nhanh chóng ta có th s ể ử
sec_mgr@KNOX10g> CREATE OR REPLACE FUNCTION no_records (
p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
BEGIN
RETURN '1=0';
END;
/
Function created.
ụ d ng nó:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ể ế ộ ả ỉ ượ ả ộ Đây cũng là m t cách giúp ta có th bi n m t b ng thành b ng ch đ c phép
ỉ ầ ả ớ ự ọ đ c (Read Only table). Ta ch c n đăng ký policy function trên cho b ng đó v i l a
ụ ệ ọ ch n áp d ng cho các câu l nh INSERT, UPDATE, DELETE:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
sec_mgr@KNOX10g> BEGIN
DBMS_RLS.add_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'PEOPLE_RO_IUD',
function_schema => 'SEC_MGR',
policy_function => 'No_Records',
statement_types =>
'INSERT,UPDATE,DELETE',
update_check => TRUE);
END;
/
PL/SQL procedure successfully completed.
scott@KNOX10g> SELECT COUNT (*) FROM emp;
COUNT(*)
----------
14
scott@KNOX10g> -- Không thể update bất kỳ record nào
scott@KNOX10g> UPDATE emp SET username = NULL;
0 rows updated.
scott@KNOX10g> -- Không thể delete bất kỳ record nào
scott@KNOX10g> DELETE FROM emp;
0 rows deleted.
scott@KNOX10g> -- Không thể insert thêm bất kỳ record nào
scott@KNOX10g> INSERT INTO emp (username) VALUES ('KNOX');
INSERT INTO emp (username) VALUES ('KNOX')
*
ERROR at line 1:
ORA-28115: policy with check option violation
ể ạ ụ ệ ả ậ Ki m tra l i vi c áp d ng chính sách b o m t trên:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ỏ ệ ể ả ậ ượ Đ xóa b vi c 1 chính sách b o m t đã đ ộ c đăng ký cho m t table/view, ta
sec_mgr@KNOX10g> BEGIN
DBMS_RLS.drop_policy
(object_schema => 'SCOTT',
object_name => 'EMP',
policy_name => 'debug');
END;
/
PL/SQL procedure successfully completed.
ủ ụ ụ ủ dùng th t c DROP_POLICY c a package DBMS_RLS. Ví d :
IV. Bài t pậ
ạ ấ ả T o c u trúc b ng sau:
EMPHOLIDAY
( EmpNo NUMBER(5),
Name VARCHAR2(60),
Holiday DATE )
EmpNo Name Holiday
1 Han 2/1/2010
2 An 12/5/2010
3 Thu 26/8/2009
…
1.
ự ộ ườ ợ Xây d ng m t policy HolidayControl cho các tr ng h p sau đây:
2.
ỉ ượ ủ ử ỉ An ch đ c xem và ch nh s a thông tin cá nhân c a riêng mình.
3.
ượ ử ấ ỳ ỉ Thu không đ c xem hay ch nh s a b t k thông tin nào.
ượ ấ ả ử ư ỉ Han đ ề c quy n xem t ỉ t c các thông tin nh ng ch ch nh s a (Insert, Update, Delete)
ượ ệ ạ ằ ớ ơ ử ượ ỉ đ c Holiday nào mà ngày l n h n hay b ng ngày hi n t i (không ch nh s a đ c ngày ở
quá kh ).ứ
Ghi chú:
Chương Trình Đào Tạo Từ Xa
KH & KT Máy Tính – Đại học Bách Khoa TP.HCM
ả ữ ệ ệ ươ ứ ớ 1/ Gi thi ế ườ t tr ng Name có các d li u phân bi t nhau và t ng ng v i Username trong
ệ ố h th ng.
ứ ố ượ ầ ượ ả ệ 2/ Schema ch a đ i t ng c n đ c b o v là SCOTT.
ứ ượ ử ụ 3/ Schema ch a policy function đ c s d ng là Sec_Mgr.