<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 © 久城

    主站蜘蛛池模板: 国产大片51精品免费观看| 国产免费爽爽视频免费可以看| 亚洲无线码在线一区观看| 黄色网址在线免费观看| 免费高清小黄站在线观看| 亚洲一区二区三区国产精华液| 好男人看视频免费2019中文| 亚洲中文字幕无码中文字| 午夜神器成在线人成在线人免费| 亚洲人成人网毛片在线播放| 免费看美女让人桶尿口| 久久精品国产亚洲av瑜伽| 免费A级毛片无码A∨男男| yy一级毛片免费视频| 亚洲高清国产AV拍精品青青草原| 光棍天堂免费手机观看在线观看| 亚洲国产精品久久| 91精品免费在线观看| 亚洲精品成a人在线观看☆| 国产一区二区三区免费在线观看 | 亚洲国产日韩精品| 国产精品久久香蕉免费播放| 人成午夜免费大片在线观看| 亚洲一区二区三区自拍公司| 99re在线这里只有精品免费| 亚洲无码一区二区三区| 中文字幕亚洲综合久久菠萝蜜| 久久国产精品2020免费m3u8| 亚洲校园春色另类激情| 亚洲 小说区 图片区 都市| 精品国产麻豆免费人成网站| 亚洲人成激情在线播放| 亚洲电影日韩精品| 99爱在线精品视频免费观看9| 亚洲一区精彩视频| 久99精品视频在线观看婷亚洲片国产一区一级在线 | a级毛片免费观看视频| 亚洲国产精品成人综合色在线婷婷| 卡一卡二卡三在线入口免费| 成年免费a级毛片免费看无码| 亚洲一级片在线观看|