2017-02-13 5 views
0

データベースアクセスを制限する仮想プライベートデータベースを作成しようとしています。ユーザーがすべての列を表示しないように制限する方法について悩んでいます。私の割り当てでは、ユーザを2列に制限するように求められています。Oracle VPD列の制限

データベースアクセスを制限する仮想プライベートデータベースを設計して実装します。デザインは、2つの列と2つのテーブルに基づいている必要があります。 (ヒント:col1 = value1、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でのみ動作します。 Ifはdbms_rls.ALL_ROWSです。 - oracleのセンシティブな列oracleの値は、nullを返します。 /

結果から列を削除したい場合は、ビューを作成する必要があります。また、アクセスすることのみを許可する。