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

Oracle VPD 與 Spatial 實現動態時空數據行級授權

     編輯:Oracle 資料庫基礎

業務挑戰

CycloMedia 擁有上千萬筆全景影像,每筆含座標 (SDO_GEOMETRY) 與拍攝時間。需向動態用戶群開放依「空間範圍 + 時間區間」授權的資料存取,傳統靜態授權表無法應對資料與用戶的雙重動態性。

架構選型:Truman 模型 + Oracle VPD

Truman 模型 (FGAC/RLS):在資料庫層透明改寫用戶查詢,附加授權謂詞,用戶感知不到限制。
Oracle Virtual Private Database (VPD):企業版內建,將安全策略函數綁定至表/視圖,查詢時自動在 WHERE 附加謂詞,完美落地 Truman 模型。

資料模型設計

  1. 核心表 IMAGES:IMAGE_ID (PK), RECORDING_LOCATION (SDO_GEOMETRY), RECORDING_DATETIME,建立空間索引與時間索引。
  2. 授權模型表群:CONTRACTS、CLIENTS、USERS、ACCESS_AREAS (空間幾何 + 時間區間)。
  3. 視圖 CONDITION_SETS:匯總某用戶可存取的所有 (空間, 時間) 組合。

VPD 策略實作

1. 建立會話上下文

-- 登入觸發器設定 CLIENT_ID
CREATE OR REPLACE TRIGGER set_ctx_after_logon
AFTER LOGON ON DATABASE
BEGIN
    DBMS_SESSION.SET_CONTEXT('THE_CTX', 'THE_CLIENT_ID', get_client_id(USER));
END;

2. 策略函數

CREATE OR REPLACE PACKAGE exp_security AS
    FUNCTION client_id_security(p_owner VARCHAR2, p_objname VARCHAR2) RETURN VARCHAR2;
END;

CREATE OR REPLACE PACKAGE BODY exp_security AS
    FUNCTION client_id_security(p_owner VARCHAR2, p_objname VARCHAR2) RETURN VARCHAR2 IS
    BEGIN
        RETURN 'CLIENT_ID = SYS_CONTEXT(''THE_CTX'',''THE_CLIENT_ID'')';
    END;
END;

3. 綁定策略至 CONDITION_SETS

EXEC DBMS_RLS.ADD_POLICY(
    'BART', 'CONDITION_SETS', 'CONDITION_SETS_POLICY',
    'BART', 'EXP_SECURITY.CLIENT_ID_SECURITY', 'SELECT');

空間授權視圖:解決 SDO_INSIDE 無法直接用於子查詢的限制

Oracle Spatial SDO_INSIDE(geom, geo) 不支援子查詢作為第二參數,必須用 Join。故建立視圖預先 Join:

CREATE VIEW images_authorized AS
SELECT i.*
FROM images i, condition_sets c
WHERE i.recording_datetime BETWEEN c.start_date AND c.end_date
  AND SDO_INSIDE(i.recording_location, c.geo) = 'TRUE';

再建立 images_authorized_fixed 以 DISTINCT 去除多重授權區間導致的重複行。

前端整合:Google Earth + KML

  • Web 服務器接收 HTTP Basic Auth,建立資料庫連線 (VPD 自動生效)。
  • 查詢視窗內授權影像:SELECT ... FROM bart.images_authorized WHERE SDO_FILTER(recording_location, :window) = 'TRUE',無任何授權邏輯。
  • 結果轉 KML 回傳 Google Earth 顯示:綠標記=可存取,紅標記=不可存取 (來自 images_unauthorized 視圖),點擊紅標記彈出銷售連結。

踩坑記:SDO_NN 最近鄰居查詢的資訊洩露

使用 SDO_NN 尋找最近授權影像時,若更近處存在未授權影像,查詢會無聲無息回傳「無結果」,間接洩露未授權物件存在。
規避方案:改用 SDO_WITHIN_DISTANCE 先過濾授權子集,再排序取第一筆。

複雜時空查詢:最新影像覆蓋判斷

需求:只顯示最新影像,排除被較新影像在時空上覆蓋的舊影像。
SQL 邏輯:對每筆影像,檢查是否存在「空間距離極近且時間差極小」的較新影像,若存在則排除。Google Earth 以高度視覺化時間維度,綠色圓柱代表最新影像覆蓋範圍。

效能與結論

  • 測試環境 (DB+中介軟體+GIS 同機) 效能達標,擴展性測試通過。
  • 優勢:授權不破壞資料使用性、原生支援動態集合、GIS 工具零修改復用。
  • 缺陷:SDO_NN 在 VPD 視圖上存在資訊洩露風險,需謹慎使用或等待資料庫內核修復。

未來展望:Microsoft Research 提出將謂詞直接納入 GRANT SELECT ... WHERE predicate,比 VPD 策略函數分離更直觀,期待成標準。

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