基於VPD的資料管理
VPD這東西,ORACLE8i就已經有了,以前我們的系統主要是面向醫院使用,更多的是一個OLTP 系統,雖然VPD有用,但不值得冒這個險使用這個技術。但如果使用在一個彙總的資料庫中,尤其對於安全特性考慮比較多的地方,還是值得試一試。
前段時間開發了一個科訓系統,本意是給科訓局做統計上報。這個程式能否推下去,目前還不明朗,但可以拿其中的資料做些測試。
以論文(表paper)為例(個人認為,這個表的名稱應該為複數更合適),其中有個欄位organ_code 表示該論文屬於哪個單位的,單位編碼是按級別編寫,例如第二軍醫大學為D2, 長征醫院為D22 ,如果不同單位的人想訪問這個表,則希望只能訪問其本單位或者下屬單位的資料。
表users 中有個欄位organ_code 表示該使用者屬於哪個單位。
以SYSTEM使用者建立包:pck_vpd
create or replace package pck_vpd
as
p_organ_code users.organ_code%type;
procedure set_organ_code(v_organ_code users.organ_code%type);
function predicate (obj_schema varchar2, obj_name varchar2) return varchar2;
end pck_vpd;
/
create or replace package body pck_vpd as
procedure set_organ_code(v_organ_code users.organ_code%type) is
begin
p_organ_code := v_organ_code;
end set_organ_code;
function predicate (obj_schema varchar2, obj_name varchar2) return varchar2 is
begin
return 'organ_code like ''' || p_organ_code||'%''';
end predicate;
end pck_vpd;
/
建立觸發器:
create or replace trigger trg_vpd
after logon on database
declare
v_organ_code users.organ_code%type;
begin
begin
select organ_code into v_organ_code
from users where upper(db_user) = user;
exception when NO_DATA_FOUND then
v_organ_code :='';
end;
pck_vpd.set_organ_code(v_organ_code);
end;
/
新增策略:
begin
dbms_rls.add_policy (
'TRAIN',
'PAPER',
'paper policy name',
user,
'pck_vpd.predicate',
'select,update,delete');
end;
/
以使用者LGB(我們一個同事的使用者名稱,我們稱之為老幹部)為例:
update users set organ_code='E' where db_user='LGB';
commit;
SQL> conn lgb/lgb@dbserver
Connected.
SQL> select distinct organ_code from paper ;
ORGAN_COD
---------
E
E0845
修改下使用者的organ_code
update users set organ_code='D' where db_user='LGB';
commit;
SQL> conn lgb/lgb@dbserver
Connected.
SQL> select distinct organ_code from paper ;
ORGAN_COD
---------
D
D30
D31
D40
D4061
D4062
D41
D45
8 rows selected.
我們在很多例子裡都看到要建立觸發器,其實主要是對於那些非靜態的謂詞建立,如果是靜態的,例如” dept_no = 20 “ 當然無需觸發器。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/9036/viewspace-521065/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【VPD】使用Oracle VPD(Virtual Private Database)限制使用者獲取資料的範圍OracleDatabase
- 資料分析 | 基於智慧標籤,精準管理資料
- 基於MaxCompute的數倉資料質量管理
- 基於Vue2的資料管理系統-DBMVue
- oracle 虛擬專用資料庫(VPD)Oracle資料庫
- 基於TableStore的海量電商訂單後設資料管理
- 2 Day DBA-使用基於SQL的管理工具管理資料庫SQL資料庫
- 虛擬專用資料庫VPD應用資料庫
- Oracle安全 - 虛擬專用資料庫 VPDOracle資料庫
- 2 Day DBA-使用基於SQL的管理工具管理資料庫-關於SQL DeveloperSQL資料庫Developer
- 蘇州X銀行基於精益管理的資料改善研究
- 關於資料的管理和挖掘
- 資料搬運元件:基於Sqoop管理資料匯入和匯出元件OOP
- Docker 基礎 : 資料管理Docker
- 基礎工作--資料管理
- 基於DataTables的資料操作demo
- 基於資料塊的恢復
- 基於策略的管理方案
- 2 Day DBA-使用基於SQL的管理工具管理資料庫-啟動SQL*Plus連線資料庫SQL資料庫
- 【原創】演示一個VPD進行資料訪問控制的示例
- 基於資料的決策:模擬與庫存管理(附PPT下載)
- 關於資料庫碎片管理資料庫
- 基於 Spark 的資料分析實踐Spark
- 基於Kerberos的大資料安全方案ROS大資料
- 基於PMEM的PG資料庫Memhive資料庫Hive
- 基於Prometheus的資料庫監控Prometheus資料庫
- 基於cancel的資料庫恢復資料庫
- 資料庫基於版本的閃回資料庫
- 資料庫開發(19)基於物件的資料庫資料庫物件
- 基於品類管理的電商倉儲企業資料化運營管理模式探討模式
- 2 Day DBA-使用基於SQL的管理工具管理資料庫-網路配置工具SQL資料庫
- 2 Day DBA-使用基於SQL的管理工具管理資料庫-Oracle Net Listener配置SQL資料庫Oracle
- 基於投入資金的CTA策略開平倉管理
- 深圳X科技基於大資料技術提高六西格瑪管理大資料
- 使用Oracle VPD(Virtual Private Database)實現資料庫層面資料許可權OracleDatabase資料庫
- 資料倉儲 vs 資料湖 vs 湖倉一體:如何基於自身資料策略,選擇最合適的資料管理方案?
- 基於SOA 的儲存管理
- 2 Day DBA-使用基於SQL的管理工具管理資料庫-客戶端連線SQL資料庫客戶端