利用Oracle虚拟私有数据库进行整合
Oracle虛擬私有數(shù)據(jù)庫(kù)(Virtual Private Database,下文簡(jiǎn)稱(chēng)VPD)是Oracle數(shù)據(jù)庫(kù)產(chǎn)品中提供的一個(gè)安全功能,它能夠保證Oracle數(shù)據(jù)庫(kù)的多租戶(hù)特性,與此同時(shí),可以幫助用戶(hù)進(jìn)行數(shù)據(jù)庫(kù)的整合。
Oracle VPD能夠針對(duì)數(shù)據(jù)庫(kù)表和視圖,在行與列級(jí)別對(duì)數(shù)據(jù)訪(fǎng)問(wèn)進(jìn)行控制。從名稱(chēng)來(lái)看,Oracle VPD表達(dá)的意思多少有些誤導(dǎo)的嫌疑,畢竟Oracle數(shù)據(jù)庫(kù)已經(jīng)是一個(gè)多用戶(hù)的數(shù)據(jù)庫(kù),每個(gè)用戶(hù)也許沒(méi)有意識(shí)到他們正在共享數(shù)據(jù)庫(kù)。因此,將Oracle VPD稱(chēng)為虛擬私有模式對(duì)象(Virtual Private Schema Object,VPSO)更為貼切,因?yàn)樗鼤?huì)在數(shù)據(jù)庫(kù)內(nèi)將表、視圖以及同義詞進(jìn)行虛擬化。但是在本文中,我們還是現(xiàn)將其稱(chēng)為VPD。
鑒于Oracle的用戶(hù)/角色安全權(quán)限模型允許訪(fǎng)問(wèn)模式對(duì)象,因此VPD將通過(guò)訪(fǎng)問(wèn)策略來(lái)強(qiáng)制對(duì)模式對(duì)象數(shù)據(jù)的細(xì)粒度訪(fǎng)問(wèn)。當(dāng)訪(fǎng)問(wèn)策略開(kāi)始執(zhí)行,VPD將會(huì)動(dòng)態(tài)地調(diào)整SQL語(yǔ)句,如SELECT、UPDATE和INSERT,其方式就是加一個(gè)WHERE條件來(lái)過(guò)濾結(jié)果。VPD不僅對(duì)用戶(hù)是透明的,而且它的安全性是無(wú)法被忽視的。在Oracle企業(yè)版數(shù)據(jù)庫(kù)產(chǎn)品中,VPD選項(xiàng)還是免費(fèi)提供的。
在下文要提到的VPD用例中,將介紹它如何在同一個(gè)模式下存儲(chǔ)多個(gè)公司的數(shù)據(jù)。
使用Oracle VPD
在許多初創(chuàng)的公司中,口香糖生產(chǎn)公司ABC看到了商機(jī),希望能夠借助托管的業(yè)務(wù)系統(tǒng)來(lái)迅速占領(lǐng)市場(chǎng)。他們決定建立一個(gè)客戶(hù)信息系統(tǒng)(CIS)作為集中的網(wǎng)絡(luò)托管與數(shù)據(jù)服務(wù)應(yīng)用。為了讓這個(gè)基于云的SaaS交付模型能夠取得成功,他們必須整理一套解決方案,能夠不修改現(xiàn)有的應(yīng)用代碼,并提供數(shù)據(jù)安全性保障,并快速地進(jìn)行測(cè)試,將投資回報(bào)率最大化。
公司的IT團(tuán)隊(duì)否定了為每個(gè)客戶(hù)端部署單獨(dú)的數(shù)據(jù)庫(kù)策略,因?yàn)檫@樣做無(wú)法滿(mǎn)足所有的需求。因此他們開(kāi)始考慮共享一個(gè)單獨(dú)的數(shù)據(jù)庫(kù),其中數(shù)據(jù)庫(kù)負(fù)責(zé)人建議在同一個(gè)數(shù)據(jù)庫(kù)模式下用Oracle VPD存儲(chǔ)多客戶(hù)數(shù)據(jù)。他解釋了VPD對(duì)于應(yīng)用是完全透明的,能夠提供行級(jí)數(shù)據(jù)安全,滿(mǎn)足銷(xiāo)售團(tuán)隊(duì)的靈活性需求,它是最劃算的部署策略。他解釋了客戶(hù)為何無(wú)法認(rèn)識(shí)到他們?cè)诠蚕硪粋€(gè)模式對(duì)象。
?
此外,他還描述了設(shè)計(jì)的主要組件是如何部署的(表1)。首先,用戶(hù)將繼續(xù)使用特定客戶(hù)端連接池作為一個(gè)代理,通過(guò)現(xiàn)有的Web應(yīng)用來(lái)連接到數(shù)據(jù)庫(kù)。當(dāng)數(shù)據(jù)庫(kù)會(huì)話(huà)建立之后,一個(gè)應(yīng)用語(yǔ)境將被設(shè)置來(lái)高效地捕獲客戶(hù)端標(biāo)識(shí)符屬性。安全性訪(fǎng)問(wèn)策略將基于一個(gè)策略函數(shù),它將應(yīng)用到模式對(duì)象中以強(qiáng)制客戶(hù)端數(shù)據(jù)的邏輯分離。策略函數(shù)將使用應(yīng)用語(yǔ)境和一個(gè)客戶(hù)端標(biāo)識(shí)列來(lái)返回一個(gè)條件限制行,訪(fǎng)問(wèn)CIS的表、視圖以及同義詞。
表1:ABC的VPD設(shè)置
--以數(shù)據(jù)庫(kù)VPD管理員身份登錄
--創(chuàng)建一個(gè)應(yīng)用語(yǔ)境持有客戶(hù)端標(biāo)識(shí)符
create context client_ctx using client_ctx_pkg;
context CLIENT_CTX created.
--創(chuàng)建一個(gè)PL/SQL包對(duì)應(yīng)用語(yǔ)境進(jìn)行設(shè)置
create or replace package client_ctx_pkg is procedure set_client_id; end;
/
create or replace package body client_ctx_pkg is procedure set_client_id as client_id number;
begin
select client_id into client_id
from CIS.client where client_name = sys_context('userenv', 'session_user');
dbms_session.set_context('client_ctx', 'client_id', client_id);
exception
when no_data_found then null;
end;
end;
/
PACKAGE client_ctx_pkg compiled
PACKAGE BODY client_ctx_pkg compiled
--創(chuàng)建一個(gè)登錄觸發(fā)器以運(yùn)行應(yīng)用語(yǔ)境PL/SQL包
create trigger set_client_id_ctx_trg after logon on database
begin
client_ctx_pkg.set_client_id;
end;
/
TRIGGER set_client_id_ctx_trg compiled
--創(chuàng)建一個(gè)PL/SQL策略函數(shù)來(lái)限制數(shù)據(jù)訪(fǎng)問(wèn)
create or replace function filter_client_data( schema_p in varchar2, table_p in varchar2)
return varchar2
as client_predicate varchar2 (100);
begin
client_predicate := 'client_id = sys_context(''client_ctx'', ''client_id'')';
return client_predicate;
end;
/
FUNCTION filter_client_data compiled
--基于策略函數(shù)創(chuàng)建一個(gè)安全性策略并應(yīng)用到客戶(hù)表
begin
dbms_rls.add_policy (object_schema => 'cis'
,object_name => 'customer'
,policy_name => 'client_policy'
,function_schema => 'vpd_admin'
,policy_function => 'filter_client_data'
);
end;
/
anonymous block completed
設(shè)置好了,VPD現(xiàn)在可以動(dòng)態(tài)地添加條件到每一個(gè)查詢(xún),并高效地過(guò)濾每一個(gè)客戶(hù)端的數(shù)據(jù)(表2)。
表2:ABC運(yùn)行VPD
--1.作為一個(gè)Big Bubble Company用戶(hù),選擇你的客戶(hù)
select customer_name from CIS.customer;
CUSTOMER_NAME
------------------------------
The Gum Shop
Jaime’s Candy
Shannon’s Pharmacy
-- 2. 作為一個(gè)Chew IT Enterprises 用戶(hù),選擇你的客戶(hù)
select customer_name from CIS.customer;
CUSTOMER_NAME
------------------------------
Sweet Tooth
Gum Emporium
--確認(rèn)VPD動(dòng)態(tài)添加一個(gè)條件到每個(gè)查詢(xún)
explain plan
set statement_ID = 'XXX'
for select * from CIS.customer;
select * from table(dbms_xplan.display('PLAN_TABLE','XXX','TYPICAL'));
------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 2 | 60 | 3 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL| CUSTOMER | 2 | 60 | 3 (0)| 00:00:01 |
------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("CLIENT_ID"=TO_NUMBER(SYS_CONTEXT('client_ctx','client_id')))
?
本文轉(zhuǎn)自 wws5201985 51CTO博客,原文鏈接:http://blog.51cto.com/wws5201985/775951,如需轉(zhuǎn)載請(qǐng)自行聯(lián)系原作者
總結(jié)
以上是生活随笔為你收集整理的利用Oracle虚拟私有数据库进行整合的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。