ºìÁªLinuxÃÅ»§
Linux°ïÖú

Õë¶ÔOracle 10gÖÐÐéÄâרÓÃÊý¾Ý¿âÏê½â

·¢²¼Ê±¼ä:2007-03-01 00:51:13À´Ô´:ºìÁª×÷Õß:Dream
¡¡¡¡ÐéÄâרÓÃÊý¾Ý¿â (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¸öÓû§²é¿´µÍÓÚÄ³ÌØ¶¨Óà¶îµÄÕÊ»§£¬¶ø¸ÃÓà¶îÓÉÓ¦ÓóÌÐòÉÏÏÂÎÄËù¾ö¶¨¡£ÎÒÃ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 ¿ÉÒÔÔڻỰµÄǰÆÚÉ趨£¬¶øº¯ÊýÔÚÔËÐÐʱ¿ÉÒÔÈÝÒ׵ػñµÃ¸ÃÊýÖµ¡£
ÎÄÕÂÆÀÂÛ

¹²ÓÐ 1 ÌõÆÀÂÛ

  1. Dream ÓÚ 2007-03-01 00:52:07·¢±í:

    ¡¡¡¡Çë×ÐϸעÒâ¸ÃʾÀý¡£Î½´ÊÓÐÁ½²¿·Ö£ºÐ¡ÓÚºÅ֮ǰµÄ²¿·ÖºÍÖ®ºóµÄ²¿·Ö¡£Ö®Ç°µÄ²¿·ÖÊÇ¡°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" ¿ÉÒÔÔÚÒÔÉÏËùʾµÄÇé¿öÖв»ÔÙÖ´Ðиú¯Êý£¬´Ó¶øÌá¸ßÁËÐÔÄÜ¡£