2017-02-13 56 views
0

我正在嘗試創建一個限制數據庫訪問的虛擬專用數據庫。我被困在如何限制用戶查看所有列。我的任務要求將用戶限制爲兩列:Oracle VPD列限制

設計和實施限制數據庫訪問的虛擬專用數據庫。您的設計應基於您的兩列和兩張表格。 (提示:其中col1 = value1 AND col2 = value2)。

這裏是我當前的DDL語句:

CREATE OR REPLACE FUNCTION auth_client(
v_schema IN VARCHAR2, 
v_objname IN VARCHAR2) 
RETURN VARCHAR2 AS 
con VARCHAR2 (200); 
BEGIN 
con := 'SALES_REP_ID = 4111'; 
RETURN (con); 
END auth_client; 
/

BEGIN 
DBMS_RLS.ADD_POLICY (
object_schema => 'general_manager', 
object_name => 'client', 
policy_name => 'client_policy', 
policy_function => 'auth_client', 
sec_relevant_cols => 'sales_rep_id'); 
END; 
/

從我的理解中,sec_relevant_cols聲明是假設所有的限制,但在查詢中指定的列,但所有列仍顯示。

回答

1

VPD允許您只隱藏列中的值而不從結果中刪除列;

create table vpd_table 
as select mod(level,2) as nr,level lv from dual connect by level < 100; 

select * from vpd_table; 


CREATE OR REPLACE FUNCTION auth_function(
v_schema IN VARCHAR2, 
v_objname IN VARCHAR2) 
RETURN VARCHAR2 AS 
con VARCHAR2 (200); 
BEGIN 
con := 'nr = 1'; 
RETURN (con); 
END ; 
/

BEGIN 
DBMS_RLS.ADD_POLICY (
object_name => 'vpd_table', 
policy_name => 'client_policy', 
policy_function => 'auth_function', 
sec_relevant_cols => 'nr', 
sec_relevant_cols_opt => dbms_rls.ALL_ROWS); 
END; 
/

begin 
DBMS_RLS.DROP_POLICY(null, 'vpd_table', 'client_policy'); 
end; 

什麼是重要的。

sec_relevant_cols - 敏感列的列表。 'col1 col2' or 'col1,col2' - 兩種格式均受支持。

sec_relevant_cols_opt - 僅與sec_relevant_cols一起工作。如果是dbms_rls.ALL_ROWS - 對於敏感列oracle中的orignals值顯示爲空。 /

如果想要從結果中刪除列,您必須創建視圖。並授予訪問權限只有競爭。