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

Oracle 資料分片技術實現與權限控制方案

     編輯:Oracle 資料庫基礎

背景

Oracle 僅提供物件級權限(表、視圖、套件等),無原生欄位級權限。大型 MIS 系統常需依組織/部門進行資料分片(Data Slicing),限制使用者只能存取特定範圍資料。

典型實現架構

  1. 在基礎表(如 CUSTOMER)新增分片欄位:
    • SGRANT_NUM NUMBER(20):權限範圍編碼
    • SUNIT_ID VARCHAR2(10):所屬部門代碼
  2. 建立動態視圖 CUSTOMER_PV:
    CREATE VIEW customer_pv AS
    SELECT * FROM customer a
    WHERE a.sunit_id IS NULL
       OR EXISTS (
         SELECT 1 FROM customer b
         WHERE a.sunit_id = b.sunit_id
           AND b.sgrant_num BETWEEN TO_NUMBER(SUBSTR(USERENV('CLIENT_INFO'),1,10))
                                AND TO_NUMBER(SUBSTR(USERENV('CLIENT_INFO'),11,10))
       );
  3. 用戶登入應用時,由應用層設定 CLIENT_INFO(如 DBMS_APPLICATION_INFO.SET_CLIENT_INFO),寫入該用戶的分片編號範圍。
  4. 所有查詢操作視圖而非基礎表,自動套用分片過濾。

優缺點分析

優點缺點
服務端自動完成,應用層無感僅支援縱向(組織)分片,靈活度有限
效能影響極小,海量資料亦適用基礎表結構變更需同步重建視圖
組織架構調整時需重新配置分片編號

擴展建議

  • 結合 VPD (Virtual Private Database) / Fine-Grained Access Control 實現更細粒度、動態的行級安全策略。
  • 使用 SYS_CONTEXT 替代 USERENV('CLIENT_INFO'),提升可維護性與安全性。
  • 視圖定義中避免相關子查詢,改用 JOIN 或 IN 提升執行計劃穩定性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved