【VPD】使用Oracle VPD(Virtual Private Database)限制使用者獲取資料的範圍
VPD全稱Virtual Private Database,這個技術提供了對資料庫資訊的細粒度訪問控制。關於VPD的更多描述性資訊可透過Oracle官方文件獲得:
透過一個具體案例,體驗一下VPD帶給我們的功能特點。
1.初始化環境
構造表T,其中包含一個欄位X。
sec@ora10g> create table t (x number);
sec@ora10g> insert into t values (1);
sec@ora10g> insert into t values (2);
sec@ora10g> insert into t values (10001);
sec@ora10g> insert into t values (10002);
sec@ora10g> commit;
sec@ora10g> select * from t;
X
----------
1
2
10001
10002
2.問題場景描述
禁止查詢T表中X列值大於10000的資料。
3.實現方法一:使用檢視
這種方法可能是大家都很容易想到的,實現起來相對簡單。但無法真正做到禁止訪問基礎表。
sec@ora10g> create view v_t as select * from t where x <=10000;
View created.
sec@ora10g> select * from v_t;
X
----------
1
2
此時如果直接查詢基礎表t,仍然可以獲得說有的資料。
sec@ora10g> select * from t;
X
----------
1
2
10001
10002
4.實現方法二:使用VPD
1)建立VPD需要的函式,這裡給出的名字是f_limited_query_t。
CREATE OR REPLACE FUNCTION f_limited_query_t (s_schema IN VARCHAR2,
s_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'X <= 10000';
END;
/
Function created.
2)將函式與需要保護的表進行關聯
BEGIN
DBMS_RLS.add_policy (object_schema => 'SEC',
object_name => 'T',
policy_name => 'POLICY_LIMITED_QUERY_T',
function_schema => 'SEC',
policy_function => 'F_LIMITED_QUERY_T');
END;
/
PL/SQL procedure successfully completed.
3)驗證VPD效果
此時在sec使用者下直接查詢t表,獲得的也僅僅是我們要求的資料範圍。
sec@ora10g> select * from t;
X
----------
1
2
即便是連線到其他使用者依然無法獲得sec使用者下t表隱藏掉的資料。
sec@ora10g> conn secooler/secooler
Connected.
secooler@ora10g> select * from sec.t;
X
----------
1
2
只有sys使用者有權檢視到sec使用者下t表的全部資料
sec@ora10g> conn / as sysdba
Connected.
sys@ora10g> select * from sec.t;
X
----------
1
2
10001
10002
4)去掉VPD對資料訪問的限制
我們可以使用DBMS_RLS.drop_policy來完成這個任務。
secooler@ora10g> conn sec/sec
Connected.
BEGIN
DBMS_RLS.drop_policy (object_schema => 'SEC',
object_name => 'T',
policy_name => 'POLICY_LIMITED_QUERY_T');
END;
/
PL/SQL procedure successfully completed.
此時可獲得T表的全部資料
sec@ora10g> select * from t;
X
----------
1
2
10001
10002
5.小結
這裡給出的是VPD最簡單的一種使用方法,在實際應用中需求可能會比較複雜,但透過分析並仔細定製,VPD都可以勝任。
歡迎大家分享關於VPD技術的具體應用案例。
Good luck.
secooler
10.09.07
-- The End --
透過一個具體案例,體驗一下VPD帶給我們的功能特點。
1.初始化環境
構造表T,其中包含一個欄位X。
sec@ora10g> create table t (x number);
sec@ora10g> insert into t values (1);
sec@ora10g> insert into t values (2);
sec@ora10g> insert into t values (10001);
sec@ora10g> insert into t values (10002);
sec@ora10g> commit;
sec@ora10g> select * from t;
X
----------
1
2
10001
10002
2.問題場景描述
禁止查詢T表中X列值大於10000的資料。
3.實現方法一:使用檢視
這種方法可能是大家都很容易想到的,實現起來相對簡單。但無法真正做到禁止訪問基礎表。
sec@ora10g> create view v_t as select * from t where x <=10000;
View created.
sec@ora10g> select * from v_t;
X
----------
1
2
此時如果直接查詢基礎表t,仍然可以獲得說有的資料。
sec@ora10g> select * from t;
X
----------
1
2
10001
10002
4.實現方法二:使用VPD
1)建立VPD需要的函式,這裡給出的名字是f_limited_query_t。
CREATE OR REPLACE FUNCTION f_limited_query_t (s_schema IN VARCHAR2,
s_object IN VARCHAR2)
RETURN VARCHAR2
AS
BEGIN
RETURN 'X <= 10000';
END;
/
Function created.
2)將函式與需要保護的表進行關聯
BEGIN
DBMS_RLS.add_policy (object_schema => 'SEC',
object_name => 'T',
policy_name => 'POLICY_LIMITED_QUERY_T',
function_schema => 'SEC',
policy_function => 'F_LIMITED_QUERY_T');
END;
/
PL/SQL procedure successfully completed.
3)驗證VPD效果
此時在sec使用者下直接查詢t表,獲得的也僅僅是我們要求的資料範圍。
sec@ora10g> select * from t;
X
----------
1
2
即便是連線到其他使用者依然無法獲得sec使用者下t表隱藏掉的資料。
sec@ora10g> conn secooler/secooler
Connected.
secooler@ora10g> select * from sec.t;
X
----------
1
2
只有sys使用者有權檢視到sec使用者下t表的全部資料
sec@ora10g> conn / as sysdba
Connected.
sys@ora10g> select * from sec.t;
X
----------
1
2
10001
10002
4)去掉VPD對資料訪問的限制
我們可以使用DBMS_RLS.drop_policy來完成這個任務。
secooler@ora10g> conn sec/sec
Connected.
BEGIN
DBMS_RLS.drop_policy (object_schema => 'SEC',
object_name => 'T',
policy_name => 'POLICY_LIMITED_QUERY_T');
END;
/
PL/SQL procedure successfully completed.
此時可獲得T表的全部資料
sec@ora10g> select * from t;
X
----------
1
2
10001
10002
5.小結
這裡給出的是VPD最簡單的一種使用方法,在實際應用中需求可能會比較複雜,但透過分析並仔細定製,VPD都可以勝任。
歡迎大家分享關於VPD技術的具體應用案例。
Good luck.
secooler
10.09.07
-- The End --
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/519536/viewspace-673062/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- VPD--Virtual Private Database / Oracle PolicyDatabaseOracle
- 使用Oracle VPD(Virtual Private Database)實現資料庫層面資料許可權OracleDatabase資料庫
- ORACLE VPD方案Oracle
- ORACLE VPD AND FGAOracle
- 利用ORACLE VPD實現使用者安全控制Oracle
- oracle 虛擬專用資料庫(VPD)Oracle資料庫
- oracle VPD介紹Oracle
- 基於VPD的資料管理
- Oracle安全 - 虛擬專用資料庫 VPDOracle資料庫
- 利用FGAC/VPD重寫使用者SQLSQL
- Oracle vs PostgreSQL DBA(21)- Oracle VPDOracleSQL
- vpd contextContext
- Oracle vs PostgreSQL DBA(22)- Oracle VPD#2OracleSQL
- 使用Virtual Private Database實現細粒度訪問控制Database
- 02-Swift4 中 Private 的 使用範圍Swift
- 虛擬專用資料庫VPD應用資料庫
- Oracle DV和OLS以及VPD的區別(轉)Oracle
- 巧用trunc函式,獲取某日期範圍內的資料函式
- vpd碰到的問題解決
- SQL入門之8 限制插入資料的範圍SQL
- 利用Oracle VPD實現行級安全保護(二)Oracle
- 利用Oracle VPD實現行級安全保護(一)Oracle
- 如何使用策略組來實現行級別的VPD
- 【原創】演示一個VPD進行資料訪問控制的示例
- 使用 Carbon 獲取指定時間範圍內的日期陣列陣列
- 使用DBMS_RLS包實現列級VPD控制
- Oracle 12.2 聯機重定義使用VPD策略的表並修改表的列名Oracle
- redis如何獲取有序集合指定範圍的個數Redis
- Oracle 12.2 聯機重定義使用VPD策略的表並不修改表的任何列Oracle
- VPD策略實現行級安全性
- 智慧手環圍欄資料API獲取API
- Oracle database 19c中獲取當前資料庫版本的方法OracleDatabase資料庫
- Scrapy爬蟲 - 獲取知乎使用者資料爬蟲
- Oracle中對使用者所能使用的資料庫資源進行限制Oracle資料庫
- 資料型別範圍資料型別
- int/double資料範圍
- TypeScript 中限制物件鍵名的取值範圍TypeScript物件
- 限制oracle資料庫例項中的使用者(user)總數Oracle資料庫