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

    主站蜘蛛池模板: 亚洲最大黄色网站| 台湾一级毛片永久免费| 亚洲欧美日韩综合久久久| 一级毛片成人免费看a| 亚洲人6666成人观看| 亚洲色欲色欲www在线丝| 91精品导航在线网址免费| 亚洲午夜无码久久久久小说| 国产亚洲精品国产| 亚洲精品色婷婷在线影院| 国产一区二区三区免费视频| 久久午夜免费视频| 84pao国产成视频免费播放| 男女一边桶一边摸一边脱视频免费| 亚洲精品宾馆在线精品酒店| 亚洲伊人精品综合在合线| 亚洲最新永久在线观看| 亚洲午夜国产精品无码老牛影视| 四虎影院永久免费观看| 国外成人免费高清激情视频| 无码永久免费AV网站| 巨波霸乳在线永久免费视频| 无码精品人妻一区二区三区免费看| 亚洲免费一区二区| 国产黄在线观看免费观看不卡 | 插鸡网站在线播放免费观看| 羞羞视频免费网站含羞草| 国产精品亚洲精品久久精品| 午夜在线a亚洲v天堂网2019| 亚洲精品无码av人在线观看| 亚洲爽爽一区二区三区| 亚洲精品视频免费观看| 久久精品夜色噜噜亚洲A∨| 亚洲毛片av日韩av无码| 亚洲人成电影网站国产精品| 亚洲无码黄色网址| 亚洲国产婷婷六月丁香| 亚洲精品色午夜无码专区日韩| 亚洲国产精品特色大片观看完整版| 国产乱子影视频上线免费观看| 国产精品酒店视频免费看|