PL/SQL 培訓(xùn)項(xiàng)目實(shí)踐與練習(xí)(一) 整理筆記
Posted on 2006-09-05 11:32 久城 閱讀(1128) 評(píng)論(1) 編輯 收藏 所屬分類: 數(shù)據(jù)庫學(xué)習(xí)
題目:
控制客戶端應(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ò)誤,望多多指教!不勝感激!