ÎåÖÖÀàÐ͵IJßÂÔ¡¢ÁÐÏà¹Ø²ßÂÔÒÔ¼°ÁÐÆÁ±ÎʹµÃ VPD ³ÉΪ DBA µÄ°²È«¹¤¾ßÏäÖÐÒ»ÖÖ¹¦Äܸü¼ÓÇ¿´óµÄ¹¤¾ß
ÐéÄâרÓÃÊý¾Ý¿â (VPD) Ò²³ÆΪϸÁ£¶È·ÃÎÊ¿ØÖÆ£¬ËüÌṩǿ´óµÄÐм¶°²È«¹¦ÄÜ¡£ËüÊÇÔÚ Oracle8i ÖÐÍƳöµÄ£¬ÒѾÊܵ½¹ã·ºµÄ»¶Ó£¬²¢ÇÒÔÚ´Ó½ÌÓýÈí¼þµ½½ðÈÚ·þÎñµÈ¸÷ÖÖÓ¦ÓóÌÐòµÃµ½²ÉÓá£
VPD µÄ¹¤×÷·½·¨ÊÇ£¬Í¨¹ý͸Ã÷µØ¸ü¸Ä¶ÔÊý¾ÝµÄÇëÇ󣬻ùÓÚһϵÁж¨ÒåµÄ±ê×¼ÏòÓû§Ìṩ±íµÄ¾Ö²¿ÊÓͼ¡£ÔÚÔËÐÐʱ£¬ËùÓвéѯ¶¼¸½¼ÓÁËν´Ê£¬ÒÔ±ãɸѡ³ö×¼ÐíÓû§¿´µ½µÄÐС£ÀýÈ磬Èç¹ûÖ»ÔÊÐíÓû§²é¿´ÕÊ»§¹ÜÀíÔ± SCOTT µÄÕÊ»§£¬Ôò VPD ÉèÖÃ×Ô¶¯µØ½«²éѯ£º
select * from accounts;
ÖØдΪ£º
select * from accounts
where am_name = 'SCOTT';
¡¡
DBA ÔÚ±í ACCOUNTS ÉÏÉèÖÃÁËÒ»Ïȫ²ßÂÔ¡£¸Ã²ßÂÔ¾ßÓÐÒ»¸öÏà¹Øº¯Êý£¬³ÆΪpolicy function£¬Ëü·µ»ØÒ»¸öÓÃ×÷ν´ÊµÄ×Ö·û´® where am_name = 'SCOTT'¡£Èç¹ûÄú²»ÊìϤ¸ÃÌØÐÔµÄÈ«²¿¹¦ÄÜ£¬ÎÒ½¨ÒéÄúÔĶÁ Oracle ÔÓÖ¾µÄÎÄÕ¡°ÀûÓà VPD ±£³ÖÐÅÏ¢µÄ˽ÃÜÐÔ¡±¡£
²ßÂÔÀàÐÍ
Éú³Éν´ÊËùÐèµÄÖظ´·ÖÎöÊÇÒ»ÖÖÔÚijЩÇé¿öÏ¿ÉÒÔ½øÐÐÐÞÕûµÄ¿ªÏú¡£ÀýÈ磬Ôڴ󲿷Öʵ¼ÊÇé¿öÖУ¬Î½´Ê²¢²»Ïó am_name = 'SCOTT' ÄÇÑùÊǾ²Ì¬µÄ£»Ëü»ùÓÚÓû§µÄÉí·Ý¡¢Óû§µÄȨÏÞ¼¶±ð¡¢Óû§ÏòÄĸöÕÊ»§¹ÜÀíÔ±½øÐб¨¸æµÈÇé¿ö,¿ÉÄܸü¾ßÓж¯Ì¬ÐÔ¡£ÓɲßÂÔº¯Êý´´½¨²¢·µ»ØµÄ×Ö·û´®¿ÉÄÜ»á¾ßÓкÜÇ¿µÄ¶¯Ì¬ÐÔ£¬¶øΪÁ˱£Ö¤Æä½á¹û£¬Oracle ±ØÐëÿ´ÎÖØÐÂÖ´ÐвßÂÔº¯Êý£¬¼ÈÀË·Ñ×ÊÔ´ÓÖ½µµÍÐÔÄÜ¡£ÔÚÕâÖÖÀàÐ͵IJßÂÔÖУ¬Î½´Êÿ´ÎÖ´ÐÐʱ¿ÉÄÜ»áÓкܴóµÄ²î±ð£¬¸Ã²ßÂÔ³ÆΪ¡°¶¯Ì¬¡±²ßÂÔ£¬ÔÚ Oracle9i Êý¾Ý¿âÒÔ¼°ÒÔÇ°µÄ°æ±¾ÖÐÒѾÌṩÁËÕâÖÖ²ßÂÔ¡£
³ýÁ˱£Áô¶¯Ì¬²ßÂÔÖ®Í⣬Oracle Êý¾Ý¿â 10g »¹»ùÓÚν´ÊµÄ¹¹ÔìÍƳöÁ˼¸ÖÖÐÂÀàÐ͵IJßÂÔ£¬ÎªÌá¸ßÐÔÄÜÌṩÁ˸üºÃµÄ¿ØÖÆ£ºcontext_sensitive¡¢shared_context_sensitive¡¢shared_static ºÍ static¡£ÏÖÔÚ£¬ÈÃÎÒÃÇÀ´Á˽âÿÖÖ²ßÂÔÀàÐ͵ÄÒâÒåÒÔ¼°ÈçºÎÔÚÊʵ±µÄ³¡ºÏÖÐʹÓÃËüÃÇ¡£
¶¯Ì¬²ßÂÔ¡£ Ϊ±£³ÖÏòºó¼æÈÝÐÔ£¬10g ÖеÄĬÈϲßÂÔÀàÐÍΪ¡°dynamic¡± -- ÕýÈç Oracle9i ÖÐÒ»Ñù¡£ÔÚÕâÖÖÇé¿öÏ£¬¶ÔÓÚÿÐÐÒÔ¼°Ã¿Î»Óû§£¬ÔÚÿ´Î·ÃÎʱíʱ¶¼¶Ô²ßÂÔº¯Êý½øÐÐÖØÐÂÇóÖµ¡£ÈÃÎÒÃÇÀ´Ïêϸ·ÖÎö²ßÂÔν´Ê£º
where am_name = 'SCOTT'
ºöÂÔµô where ×Ӿ䣬ν´Ê¾Í¾ßÓÐÁ½¸ö²»Í¬µÄ²¿·Ö£ºÔÚµÈʽ²Ù×÷·û֮ǰµÄ²¿·Ö (am_name) ºÍµÈʽ²Ù×÷·ûÖ®ºóµÄ²¿·Ö ('SCOTT')¡£ÔÚ´ó¶àÊýÇé¿öÏ£¬ºóÃæµÄ²¿·Ö¸üÏóÊDZäÁ¿£¬ÒòΪËüÊÇÓÉÓû§µÄÊý¾ÝÌṩµÄ£¨Èç¹ûÓû§ÊÇ SCOTT£¬ÔòÆäֵΪ 'SCOTT'£©¡£ÔڵȺÅÇ°ÃæµÄ²¿·ÖÊǾ²Ì¬µÄ¡£Òò´Ë£¬¼´Ê¹º¯Êý²»±ØΪÉú³ÉÊʵ±µÄν´Ê¶ø¶ÔÿÐÐÇó³ö²ßÂÔº¯ÊýµÄÖµ£¬ÓÉÓÚÁ˽âÇ°Ã沿·ÖµÄ¾²Ì¬ÐÔÒÔ¼°ºóÃ沿·ÖµÄ¶¯Ì¬ÐÔ£¬Ò²¿ÉÒÔÌá¸ßÐÔÄÜ¡£ÔÚ 10g ÖУ¬¿ÉÒÔÔÚ dbms_rls.add_policy µ÷ÓÃÖÐʹÓà "context_sensitive" ÀàÐ͵IJßÂÔ×÷Ϊ²ÎÊýÀ´ÊµÏÖÕâÖÖ·½·¨£º
policy_type => dbms_rls.context_sensitive
ÔÚÁíÒ»¸öʾÀýÖУ¬ÎÒÃÇÓÐÒ»¸ö³ÆΪ ACCOUNTS µÄ±í£¬ËüÓµÓм¸ÁУ¬ÆäÖÐÒ»ÁÐÊÇ BALANCE£¬±íʾÕÊ»§Óà¶î¡£¼ÙÉèÔÊÐíij¸öÓû§²é¿´µÍÓÚijÌض¨Óà¶îµÄÕÊ»§£¬¶ø¸ÃÓà¶îÓÉÓ¦ÓóÌÐòÉÏÏÂÎÄËù¾ö¶¨¡£ÎÒÃDz¢²»ÔÚ²ßÂÔº¯ÊýÖн«´ËÓà¶îÖµ¹Ì¶¨£¬¶øÊÇ3ÊǸù¾ÝÓ¦ÓóÌÐòÉÏÏÂÎÄÈ·¶¨£¬È磺
create or replace vpd_pol_func
(
p_schema in varchar2,
p_table in varchar2
)
return varchar2
is
begin
return 'balance < sys_context(''vpdctx'', ''maxbal'')';
end;
Ó¦ÓóÌÐòÉÏÏÂÎÄ VPDCTX µÄÊôÐÔ MAXBAL ¿ÉÒÔÔڻỰµÄÇ°ÆÚÉ趨£¬¶øº¯ÊýÔÚÔËÐÐʱ¿ÉÒÔÈÝÒ׵ػñµÃ¸ÃÊýÖµ¡£
Çë×ÐϸעÒâ¸ÃʾÀý¡£Î½´ÊÓÐÁ½²¿·Ö£ºÐ¡ÓÚºÅ֮ǰµÄ²¿·ÖºÍÖ®ºóµÄ²¿·Ö¡£Ö®Ç°µÄ²¿·ÖÊÇ¡°balance¡±Ò»´Ê£¬ËüÊÇÎÄ×Ö·û¡£ºóÃæµÄ²¿·Ö´ÓijÖ̶ֳȶøÑÔÊǾ²Ì¬µÄ£¬ÒòΪӦÓóÌÐòÉÏÏÂÎıäÁ¿Ôڸıä֮ǰһֱÊdz£Á¿¡£Èç¹ûÓ¦ÓóÌÐòÉÏÏÂÎÄÊôÐÔ²»±ä£¬ÔòÕû¸öν´ÊÊdz£Á¿£¬Òò´Ë²»ÐèÒªÖØÐÂÖ´Ðк¯Êý¡£Èç¹û²ßÂÔÀàÐͶ¨ÒåΪ¶ÔÉÏÏÂÎÄÃô¸Ð£¬Ôò Oracle Êý¾Ý¿â 10g ¿ÉÒÔʶ±ð´ËÇé¿öÒÔÓÃÓÚÓÅ»¯¡£Èç¹ûÔڻỰÆÚ¼äûÓз¢Éú»á»°ÉÏÏÂÎĵı仯£¬Ôò²»ÖØÐÂÖ´Ðиú¯Êý£¬´Ó¶øÏÔÖøÌá¸ßÁËÐÔÄÜ¡£
¾²Ì¬²ßÂÔ¡£ ÓÐʱҵÎñ²Ù×÷¿ÉÒÔÈ·±£Î½´Ê¸ü¼Ó¾²Ì¬¡£ÀýÈ磬ÔÚÉÏÏÂÎÄÃô¸ÐµÄ²ßÂÔÀàÐÍʾÀýÖУ¬ÎÒÃǽ«Óû§Ëù¼ûµÄ×î´óÓà¶î¶¨ÒåΪһ¸ö±äÁ¿¡£µ± web Ó¦ÓóÌÐòÖÐµÄ Oracle userid ÓÉÐí¶à web Óû§¹²Ïí£¬²¢ÇÒÓ¦ÓóÌÐò»ùÓÚÕâЩÓû§µÄȨÏÞÀ´ÉèÖøñäÁ¿£¨Ó¦ÓóÌÐòÉÏÏÂÎÄ£©Ê±£¬ÕâÖÖ·½·¨ºÜÓÐÓá£Òò´Ë£¬web Óû§ TAO ºÍ KARTHIK ¶¼ÊÇÒÔÓû§ APPUSER Á¬½Óµ½Êý¾Ý¿âµÄ£¬¶þÕß¿ÉÒÔÔÚÆä»á»°ÖÐÓµÓÐÁ½¸ö²»Í¬µÄÓ¦ÓóÌÐòÉÏÏÂÎĵÄÖµ¡£´Ëʱ MAXBAL µÄÖµ²¢²»ÒÀÀµÓÚ Oracle userid£¬¶øÊÇÒÀÀµ TAO ºÍ KARTHIK ¸÷×ԵĻỰ¡£
ÔÚ¾²Ì¬²ßÂÔµÄÇé¿öÏ£¬Î½´Ê¸ü¾ßÓпÉÔ¤²âÐÔ£¬Æä˵Ã÷ÈçÏ¡£
LORA ºÍ MICHELLE ·Ö±ðÊÇ Acme Bearings ºÍ Goldtone Bearings µÄÕÊ»§¹ÜÀíÔ±¡£µ±ËûÃÇÁ¬½ÓÊý¾Ý¿âʱ£¬ËûÃÇʹÓÃ×Ô¼ºµÄ id£¬²¢ÇÒÖ»Ó¦¸Ã¿´µ½ÊôÓÚËûÃǵÄÄÇЩÐС£ÔÚ Lora ·½Ã棬ν´Ê±ä³É where CUST_NAME = 'ACME'£»¶ø¶ÔÓÚ Michelle£¬ÔòÊÇ where CUST_NAME = 'GOLDTONE'¡£ÔÚÕâÀν´ÊÒÀÀµÓÚËûÃÇµÄ userid£¬Òò´ËËûÃÇËù´´½¨µÄÈκλỰÔÚÓ¦ÓóÌÐòÉÏÏÂÎÄÖÐʼÖÕ¾ßÓÐÏàͬµÄÖµ¡£
10g ¿ÉÒÔÀûÓÃÕâÖÖÇé¿ö£¬ÔÚ SGA ÖжÔν´Ê½øÐиßËÙ»º´æ£¬²¢ÔڻỰÖÐÖØÓøÃν´Ê£¬¶ø²»±ØÖØÐÂÖ´ÐвßÂÔº¯Êý¡£²ßÂÔº¯ÊýÀàËÆÓÚÒÔÏÂÐÎʽ£º
¡¡
create or replace vpd_pol_func
(
p_schema in varchar2,
p_table in varchar2
)
return varchar2
is
begin
return 'cust_name = sys_context(''vpdctx'', ''cust_name'')';
end;
¶ø²ßÂÔ¶¨ÒåΪ£º
policy_type => dbms_rls.static
¡¡
ÕâÖÖ·½·¨È·±£²ßÂÔº¯ÊýÖ»Ö´ÐÐÒ»´Î¡£¼´Ê¹Ó¦ÓóÌÐòÉÏÏÂÎÄÔڻỰÖиı䣬Ҳ´Ó²»ÖØÐÂÖ´Ðиú¯Êý£¬Ê¹µÃ´Ë¹ý³ÌµÄËٶȷdz£¿ì¡£
½¨Ò齫¾²Ì¬²ßÂÔÓÃÓÚÔÚ¼¸¸öÓû§ÖÐÍйÜÓ¦ÓóÌÐòµÄÇé¿ö¡£ÔÚÕâÖÖÇé¿öÏ£¬µ¥¸öÊý¾Ý¿âÓµÓм¸¸öÓû§µÄÊý¾Ý¡£µ±Ã¿¸öÓû§µÇ¼ʱ£¬µÇ¼ºó´¥·¢Æ÷¿ÉÒÔÉèÖÃÓÃÓÚ²ßÂÔº¯ÊýµÄÓ¦ÓóÌÐòÉÏÏÂÎĵÄÖµ£¬ÒÔ±ã¿ìËÙÉú³Éν´Ê¡£
µ«ÊÇ£¬½«²ßÂÔ¶¨ÒåΪ¾²Ì¬Ò²ÊÇÒ»°ÑË«Èн£¡£ÔÚÒÔÉϵÄʾÀýÖУ¬ÎÒÃǼÙÉèÓ¦ÓóÌÐòÉÏÏÂÎÄÊôÐÔ VPDCTX.CUST_NAME µÄÖµÔڻỰÖв»¸Ä±ä¡£Èç¹ûÕâÖÖ¼ÙÉè²»ÕýÈ·£¬½«»áÔõÑùÄØ£¿Èç¹û¸ÃÖµ¸Ä±ä£¬²ßÂÔº¯Êý½«²»»áÖ´ÐУ¬Òò´ËÔÚν´ÊÖн«²»»áʹÓÃÐÂÖµ£¬¶ø·µ»Ø´íÎóµÄ½á¹û£¡Òò´Ë£¬ÔÚ½«²ßÂÔ¶¨ÒåΪ¾²Ì¬Ê±Òª·Ç³£Ð¡ÐÄ£»Äú±ØÐë¾ø¶ÔȷПÃÖµ²»»á¸Ä±ä¡£Èç¹ûÄú²»ÄÜ×÷ÕâÖÖ¼ÙÉ裬Ôò×îºÃ½«²ßÂÔ¶¨ÒåΪ¶ÔÉÏÏÂÎÄÃô¸Ð¡£
¹²Ïí²ßÂÔÀàÐÍ¡£ ΪÁËÖØÓôúÂë²¢×î´óÏ޶ȵØÀûÓÃÒѾ·ÖÎö¹ýµÄ´úÂ룬Äú¿ÉÒÔ¾ö¶¨Îª¼¸¸ö±íʹÓÃͨÓõIJßÂÔº¯Êý¡£ÀýÈ磬ÔÚÉÏÊöʾÀýÖУ¬ÎÒÃÇ¿ÉÄܶÔÓÚ²»Í¬ÀàÐ͵ÄÕÊ»§ÓµÓв»Í¬µÄ±í -- SAVINGS ºÍ CHECKING -- µ«ÊǹæÔòÈÔÈ»ÊÇÏàͬµÄ£ºÏÞÖÆÓû§²é¿´Óà¶î³¬¹ýÆäÊÚȨ·¶Î§µÄÕÊ»§¡£ÕâÖÖÇé¿öÒªÇóΪ CHECKING ºÍ SAVINGS ±íÉϵIJßÂÔʹÓÃͳһµÄº¯Êý¡£¸Ã²ßÂÔ´´½¨Îª context_sensitive¡£
¼ÙÉèʼþ°´ÈçÏÂ˳Ðò·¢Éú£º
1. Á¬½Ó»á»°
2. ÉèÖÃÓ¦ÓóÌÐòÉÏÏÂÎÄ
3. select * from savings;
4. select * from checking;
¼´Ê¹Ó¦ÓóÌÐòÉÏÏÂÎÄÔÚµÚ 3 ²½ÓëµÚ 4 ²½Ö®¼äûÓиı䣬²ßÂÔº¯ÊýÒ²»áÖØÐÂÖ´ÐУ¬ÒòΪÏÖÔÚËùÑ¡ÔñµÄ±íÒѾ²»Í¬¡£Õâ²»ÊÇÎÒÃÇËùÏ£ÍûµÄÇé¿ö£¬ÒòΪ²ßÂÔº¯ÊýÏàͬ£¬²»ÐèÒªÖØÐÂÖ´Ðиú¯Êý¡£
10g ÖеÄй¦ÄÜÊÇÄܹ»ÔÚ¶ÔÏó¼ä¹²Ïí²ßÂÔ¡£ÔÚÉÏÊöʾÀýÖУ¬Äú¿ÉÒÔ½«ÕâЩ²ßÂԵIJßÂÔÀàÐͶ¨ÒåΪ£º
policy_type => dbms_rls.shared_context_sensitive
½«²ßÂÔÉùÃ÷Ϊ "shared" ¿ÉÒÔÔÚÒÔÉÏËùʾµÄÇé¿öÖв»ÔÙÖ´Ðиú¯Êý£¬´Ó¶øÌá¸ßÁËÐÔÄÜ¡£
Ñ¡ÔñÐÔµÄÁÐ
ÏÖÔÚÉèÏëÒ»ÖÖÇé¿ö£¬Ö»ÓÐÔÚÑ¡ÔñÁËÌض¨ÁÐʱ²Å»áÓ¦Óà VPD ²ßÂÔ¡£ÔÚÉÏÊöʾÀýµÄ±í ACCOUNTS ÖУ¬¸÷ÐÐÈçÏÂËùʾ£º
ACCTNO ACCT_NAME¡¡¡¡BALANCE
------ ------------ -------
1 BILL CAMP¡¡¡¡1000
2 TOM CONNOPHY 2000
3 ISRAEL D¡¡¡¡ 1500¡¡¡¡
²»ÔÊÐí Michelle ²é¿´Óà¶î³¬¹ý 1600 µÄÕÊ»§¡£µ±ËýÖ´ÐÐÀàËÆÒÔϵIJéѯʱ£º
select * from accounts;
½«¿´µ½£º
ACCTNO ACCT_NAME¡¡¡¡BALANCE
------ ------------ -------
1 BILL CAMP¡¡¡¡1000
3 ISRAEL D¡¡¡¡ 1500¡¡
acctno 2 µÄÓà¶î³¬¹ý 1600£¬ËüÒѽûÖ¹ÏÔʾ¡£¶ÔÓÚ Michelle ¶øÑÔ£¬±íÖÐÖ»ÓÐÁ½ÐУ¬¶ø²»ÊÇÈýÐС£µ±ËýÖ´ÐÐÀàËÆÒÔϵIJéѯʱ£º
select count(*) from accounts;
¸Ã²éѯֻ¼ÆËã±íÖеļǼÊý£¬Êä³öÊǶþ£¬¶ø²»ÊÇÈý¡£