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) Row­level 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” (row­level 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:

 Fine­grained 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  Application­context).

ở ươ ệ ả ổ ế ể ệ ự ệ ả 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 ậ ở

ữ ệ ứ ườ ườ ậ ữ Row­level 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 Fine­grained access control ho c ặ Virtual Private Database.

II. Row­level Security

A. Lý thuy tế

1.

Row­level Security

 Row­level 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.

Chương Trình Đào Tạo Từ Xa

KH & KT Máy Tính – Đại học Bách Khoa TP.HCM