dbms_rls 實現乙個資料庫表為行級安全控制,該**包括細粒度的訪問控制管理介面,此介面是用來實現vpd(virtual private database),虛擬專用資料庫。dbms_rls僅僅能在oracle的企業版(enterpris edition only)本才幹夠用。oracle ebs 的許可權是用這個來管理的。
在資料庫的資料安全訪問的解決上,有非常多的方法來解決許可權的問題。有的是通過功能模組來控制訪問許可權的,有的是用建立檢視的方法控制,比如查詢語句中加where語句來控制。可是用
view的方法時,當表結構或者許可權變更的時候就非常不easy操作,編碼工作量大、系統適應使用者管理體系的彈性空間較小,一旦許可權邏輯發生變動,就可能須要改動許可權體系,導致全部的view
都必須改動;用where語句能夠解決這個問題可是安全性不好,僅僅能在應用程式級別才幹控制。繞開應用程式就無法控制。
oracle vpd 技術在資料庫級別的安全控制有效的攻克了資料訪問操作的許可權問題,能夠對資料庫物件進行訪問控制,能夠靈活的隔離資料,oracle已經實現了vpd,能夠直接使用。比在應用層
許可權控制實現起來較方便,許可權維護也比easy。
vpd訪問控制原理也是使用where語句來控制,僅僅是這個where語句是資料庫在運算元據時自己主動拼接,不是在應用層拼接,並且由事先定義的策略來決定是否拼接條件語句。
以下我來用dbms_rls的包來實現例如以下條件的訪問控制功能:
有例如以下4個使用者am145,am147,am148,am149
1,僅僅能查詢oe.custs表,
2,其過濾條件是oe.custs.account_mgr_id=substr(user,3,3)
第一步:建立使用者及訪問授權
$>sqlplus / as sysdba
create user am145 identified by am145;
grant create session to am145;
grant select on oe.custs to am145;
create user am147 identified by am147;
grant create session to am147;
grant select on oe.custs to am147;
create user am148 identified by am148;
grant create session to am148;
grant select on oe.custs to am148;
create user am149 identified by am149;
grant create session to am149;
grant select on oe.custs to am149;
第二步:建立function獲得where 過濾條件的predicate.函式返回拼接在dml語句的where條件之後的語句,可是where語句並非執行dml時可見的,系統根絕策略自己主動加入的,條件來自策略
函式的返回值。
vi fun1.sql
create or replace function oe.policy_function (object_schema in varchar2, object_name varchar2)
return varchar2 is
ls_return varchar2(100);
ls_username varchar2(100);
begin
ls_username := user;
if ls_username like 'am%' then
ls_return := 'oe.custs.account_mgr_id=substr('||''''||ls_username||''''||',3,3)';
end if;
return ls_return;
end;/
sql> @fun1.sql
function created.
第三步:加入策略
vi mypolicy1.sql
begin
dbms_rls.add_policy(object_schema => 'oe',
object_name => 'custs',
policy_name => 'my_policy1',
function_schema =>'oe',
policy_function => 'policy_function',
statement_types =>'select',
enable=>true);
end;/
sql> @mypolicy1.sql
pl/sql procedure successfully completed.
第四步:驗證是否成功
sql> select account_mgr_id,count(*) from oe.custs group by account_mgr_id;
account_mgr_id count(*)
-------------- ----------
147 76
149 74
148 58
145 111
sql> conn am145/am145
connected.
sql> select count(*) from oe.custs;
count(*)
----------
111
sql> conn am147/am147
connected.
sql> select count(*) from oe.custs;
count(*)
----------76
sql> conn am148/am148
connected.
sql> select count(*) from oe.custs;
count(*)
----------58
sql> conn am149/am149
connected.
sql> select count(*) from oe.custs;
count(*)
----------74
從上面能夠看出,對使用者am145,am147,am148,am149的訪問控制成功。
note:刪除策略:
sql> conn / as sysdba
connected.
sql> exec dbms_rls.drop_policy('oe', 'custs', 'my_policy1');
pl/sql procedure successfully completed.
sql> conn am145/am145
connected.
sql> select count(*) from oe.custs;
count(*)
----------
319刪除策略後使用者am145,am147,am148,am149是能夠看oe表的全部的行資料的。
資料庫 閉包錶
一 精英 晶 1 閉包錶中設計distance欄位,用於查詢指定節點指定子層級的所有子節點 2 可管理機構的查詢 合同專案的查詢 3 查詢所有的上級機構,hd group path 4 通過為指定資料庫使用者授權訪問表的許可權 5 oracle 授權sql方法 建立dblink create pub...
Oracle資料庫 包
根據員工號或員工姓名獲取員工的資訊 根據員工號或員工姓名刪除員工的資訊 建立包規範 create or replace package overload pkg isfunction get info eno number return emp rowtype function get info n...
資料庫 資料庫基礎2 MySQL資料庫中建表
二 mysql資料庫簡介 三 mysql資料庫操作 四 mysql中建表 2 建立表 3 檢視資料庫中的表 4 顯示表結構 5 刪除表 6 修改表 五 資料的完整性約束 2 聯合主鍵 2 唯一約束 unique 3 域完整性 2 非空約束 not null 4 參照完整性 mysql資料庫是一種關係...