題目:

          控制客戶端應(yīng)用程序?qū)ν唤M數(shù)據(jù)庫的訪問權(quán)限。

          需求:

          業(yè)務(wù)數(shù)據(jù)是存儲(chǔ)在數(shù)據(jù)庫中一個(gè)SCOTT帳戶下的一個(gè)表EMP。

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

          方式:

          首先分析這個(gè)需求,簡化這個(gè)需求

          利用已經(jīng)學(xué)習(xí)到解決如何讓一個(gè)帳戶只看到一個(gè)表中一部分行,而其他部分看不到。這個(gè)時(shí)候要用到視圖,多個(gè)帳戶和表上的授權(quán)三個(gè)內(nèi)容。
          之后,分析這個(gè)解決方法的不足。

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

          接下來,進(jìn)一步提高要求,要求所有客戶端都登陸到同一個(gè)帳戶上,而且訪問同一個(gè)視圖,但這個(gè)視圖可以根據(jù)客戶端登陸時(shí)提供的信息,決定當(dāng)前會(huì)話可以查看的數(shù)據(jù)。

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

          目的:綜合利用Oracle權(quán)限管理,帳戶管理,視圖,臨時(shí)表,過程/函數(shù)的創(chuàng)建等技術(shù),解決訪問控制問題。

          相關(guān)知識(shí)理解筆記:

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

          PS:根據(jù)這個(gè)知識(shí),我建立一個(gè)臨時(shí)表,輸入一些信息,根據(jù)這些信息的不同,我所建立的視圖就不同,這樣就可以完成本題關(guān)鍵部分。

          視圖
          ?create view view_name as select * from table_name where ...
          視圖是建立在表的基礎(chǔ)上的,它只是完成表中一些數(shù)據(jù)的集體的體現(xiàn).對于表的本身并不做任何修改。比如:
          我有兩個(gè)表:
          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(...);
          現(xiàn)在我想查看table_person中名字符合table_name里的名字的人的相關(guān)信息,我可以以視圖的方式實(shí)現(xiàn):
          create view view_person as select * from table_person where name in(select * from table_name);

          具體操作:

          現(xiàn)系統(tǒng)已經(jīng)存在表EMP。(其中有empno字段)

          --建立權(quán)限數(shù)據(jù)表,用來存儲(chǔ)對每個(gè)客戶端分配的不同權(quán)限
          create table test_privileges (
          ? id?????? number(4),
          ? username varchar2(10),
          ? empno??? number(4)
          );

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

          --插入數(shù)據(jù),每一行都有一個(gè)username字段,用來區(qū)別不同的客戶端..
          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;

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

          --這里是關(guān)鍵,建立視圖。
          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');
          --所看到的內(nèi)容也就不同了
          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僅用于個(gè)人學(xué)習(xí)交流!
          目的在于記錄個(gè)人成長.
          所有文字均屬于個(gè)人理解.
          如有錯(cuò)誤,望多多指教!不勝感激!

          Feedback

          # re: PL/SQL 培訓(xùn)項(xiàng)目實(shí)踐與練習(xí)(一) 整理筆記  回復(fù)  更多評(píng)論   

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

          Copyright © 久城

          主站蜘蛛池模板: 长岭县| 上杭县| 方城县| 永善县| 缙云县| 香格里拉县| 德钦县| 徐州市| 太和县| 二手房| 集安市| 新昌县| 广汉市| 鹤山市| 广德县| 辉南县| 新营市| 鸡泽县| 舟曲县| 梓潼县| 常宁市| 东宁县| 黎平县| 顺昌县| 文山县| 都昌县| 尖扎县| 永泰县| 甘德县| 密山市| 云阳县| 中卫市| 金门县| 阳东县| 安泽县| 泰来县| 高青县| 高要市| 黄石市| 石城县| 宁阳县|