<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    PL/SQL 培訓項目實踐與練習(一) 整理筆記

    Posted on 2006-09-05 11:32 久城 閱讀(1124) 評論(1)  編輯  收藏 所屬分類: 數據庫學習

    題目:

    控制客戶端應用程序對同一組數據庫的訪問權限。

    需求:

    業務數據是存儲在數據庫中一個SCOTT帳戶下的一個表EMP。

    要求設計一種方法,客戶端在登陸到數據庫的時候,除了提供帳戶名以及口令之外,還要提供一些其他的一些信息。系統可以根據這些信息,決定這個客戶端能看到的EMP表中的特定部門工作的職員。

    方式:

    首先分析這個需求,簡化這個需求

    利用已經學習到解決如何讓一個帳戶只看到一個表中一部分行,而其他部分看不到。這個時候要用到視圖,多個帳戶和表上的授權三個內容。
    之后,分析這個解決方法的不足。

    然后進一步滿足需求,如何讓所有用戶都登陸到同一個帳戶上,然后還能看到SCOTT帳戶下EMP表的不同行的數據。這個時候可以利用現有的其他知識,如角色的生效失效等。

    接下來,進一步提高要求,要求所有客戶端都登陸到同一個帳戶上,而且訪問同一個視圖,但這個視圖可以根據客戶端登陸時提供的信息,決定當前會話可以查看的數據。

    最后再討論將這個例子放大到全體業務數據的方法,以及應用Oracle提供的其他功能(如VPD,Lavel Security等),進行其他改進的可能。

    目的:綜合利用Oracle權限管理,帳戶管理,視圖,臨時表,過程/函數的創建等技術,解決訪問控制問題。

    相關知識理解筆記:

    臨時表:
    create global temporary table table_name(
    ? username varchar2(10)
    ? ......
    );
    客戶端訪問服務器端時,服務器端會自動給每個客戶端分配一個setion,用以區別不用的客戶端,道理就象這個樣子,臨時表的用處就在此,就象它會自動設置不同的客戶端的權限一樣,比如:
    A在主機上建立一個臨時表TEMP,B可以訪問到這個表,A在TEMP上插入數據a,對于這個數據a,A可以SELECT到,但是B卻不能。同樣,B也在這個表上插入一個數據b,對于這個數據b,B可以SELECT到,而A卻不能.

    PS:根據這個知識,我建立一個臨時表,輸入一些信息,根據這些信息的不同,我所建立的視圖就不同,這樣就可以完成本題關鍵部分。

    視圖
    ?create view view_name as select * from table_name where ...
    視圖是建立在表的基礎上的,它只是完成表中一些數據的集體的體現.對于表的本身并不做任何修改。比如:
    我有兩個表:
    create table talbe_person(id number,name varchar(20));
    insert into table_person values(...,...);
    create table table_name (name,varchar(20));
    insert into table_name values(...);
    現在我想查看table_person中名字符合table_name里的名字的人的相關信息,我可以以視圖的方式實現:
    create view view_person as select * from table_person where name in(select * from table_name);

    具體操作:

    現系統已經存在表EMP。(其中有empno字段)

    --建立權限數據表,用來存儲對每個客戶端分配的不同權限
    create table test_privileges (
    ? id?????? number(4),
    ? username varchar2(10),
    ? empno??? number(4)
    );

    --建立自增序列
    create sequence seq_test_id start with 1 increment by 1;

    --插入數據,每一行都有一個username字段,用來區別不同的客戶端..
    insert into test_privileges (id,username,empno)
    values (seq_test_id.nextval,'HR',7369);

    insert into test_privileges (id,username,empno)
    values (seq_test_id.nextval,'HR',7499);

    insert into test_privileges (id,username,empno)
    values (seq_test_id.nextval,'TEST03',7521);

    insert into test_privileges (id,username,empno)
    values (seq_test_id.nextval,'TEST05',7566);
    insert into test_privileges (id,username,empno)
    values (seq_test_id.nextval,'TEST05',7900);
    insert into test_privileges (id,username,empno)
    values (seq_test_id.nextval,'TEST05',7902);
    commit;

    --建立臨時表,用來存儲用戶名,用來區別不同的客戶端
    create global temporary table t_test_info(
    ? username varchar2(10)
    );

    --這里是關鍵,建立視圖。
    create view v_emp as
    ? select * from emp
    ? where empno in
    ? (select empno
    ?? from test_privileges s,t_test_info d
    ?? where s.username = d.username);

    --這樣我每輸入不同的用戶名,之后
    insert into t_test_info values('HR');
    --所看到的內容也就不同了
    select * from v_emp;
    insert into t_test_info values('TEST05');
    ?select * from v_emp;
    insert into t_test_info values('TEST03');
    select * from v_emp;



    歡迎來訪!^.^!
    本BLOG僅用于個人學習交流!
    目的在于記錄個人成長.
    所有文字均屬于個人理解.
    如有錯誤,望多多指教!不勝感激!

    Feedback

    # re: PL/SQL 培訓項目實踐與練習(一) 整理筆記  回復  更多評論   

    2008-07-21 10:01 by ljy
    你的文章寫的很好
    對于plsql的學習也很有幫助
    謝謝 也希望你繼續努力寫出更好的文章

    Copyright © 久城

    主站蜘蛛池模板: 亚洲AV日韩AV高潮无码专区| 国产免费福利体检区久久| 亚洲一区二区三区无码中文字幕| 99精品国产免费久久久久久下载| 中文字幕视频免费在线观看| 亚洲日本天堂在线| 亚洲精品视频在线播放| 国产亚洲精久久久久久无码AV | 亚洲熟妇无码八AV在线播放| 欧美日韩国产免费一区二区三区| 在线看片免费人成视频播| 曰批免费视频播放免费| 亚洲第一男人天堂| 亚洲中字慕日产2020| 亚洲成AV人片在WWW色猫咪| 亚洲成A人片在线观看中文| 日本特黄a级高清免费大片| 色影音免费色资源| 99久久99久久精品免费观看 | 国产精品成人免费一区二区 | 久久久久亚洲精品天堂| 久久亚洲中文字幕精品一区四 | 亚洲国产高清国产拍精品| 亚洲最大黄色网址| 亚洲韩国在线一卡二卡| 久久久久亚洲AV无码专区首| 亚洲欧洲日产国码无码久久99| 亚洲成人高清在线| 免费国产一级特黄久久| 国产免费观看黄AV片| 日本一道综合久久aⅴ免费| 成年午夜视频免费观看视频| 97在线观免费视频观看| 我们的2018在线观看免费高清| 最近高清中文字幕免费| 99ee6热久久免费精品6| 在线免费观看你懂的| 91在线手机精品免费观看| **真实毛片免费观看| 黄色成人免费网站| 99re热免费精品视频观看|