首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 10g 列值遮罩:利用 VPD 實現敏感欄位動態隱藏

     編輯:Oracle 資料庫基礎

背景

Oracle 虛擬私有資料庫(VPD,Fine-Grained Access Control)可在 SELECT 等 DML 語句上施加行級安全策略。10g 新增 SEC_RELEVANT_COLS_OPT => DBMS_RLS.ALL_ROWS 選項,實現「返回所有行,但敏感欄位顯示 NULL」的列值遮罩。

實作範例

1. 建立策略函數

CREATE OR REPLACE FUNCTION rls_dept (
    obj_owner IN VARCHAR2,
    obj_name  IN VARCHAR2
) RETURN VARCHAR2 AS
    predicate VARCHAR2(200);
BEGIN
    predicate := 'department_id = 60';
    RETURN predicate;
END rls_dept;
/

2. 套用策略並指定敏感欄位

BEGIN
    DBMS_RLS.ADD_POLICY(
        object_schema      => 'HR',
        object_name        => 'EMPLOYEES',
        policy_name        => 'restrict_dept_policy',
        function_schema    => 'HR',
        policy_function    => 'rls_dept',
        sec_relevant_cols  => 'salary,commission_pct',  -- 敏感欄位
        sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS      -- 關鍵:返回所有行
    );
END;
/

運作機制

  • 查詢包含 salary 或 commission_pct 時,策略生效:滿足 department_id = 60 的行正常顯示薪資,其餘行這兩欄顯示 NULL。
  • 查詢不包含敏感欄位時,策略不生效,正常返回所有行。
  • 對所有客戶端工具(SQL*Plus、.NET、Java 等)均有效。

優勢

無需修改應用程式碼、視圖或建立獨立遮罩表;策略集中在資料庫層維護,安全性與維護性俱佳。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved