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僅用于個人學習交流!
目的在于記錄個人成長.
所有文字均屬于個人理解.
如有錯誤,望多多指教!不勝感激!