Oracle 僅提供物件級權限(表、視圖、套件等),無原生欄位級權限。大型 MIS 系統常需依組織/部門進行資料分片(Data Slicing),限制使用者只能存取特定範圍資料。
CUSTOMER)新增分片欄位:
SGRANT_NUM NUMBER(20):權限範圍編碼SUNIT_ID VARCHAR2(10):所屬部門代碼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))
);
CLIENT_INFO(如 DBMS_APPLICATION_INFO.SET_CLIENT_INFO),寫入該用戶的分片編號範圍。| 優點 | 缺點 |
|---|---|
| 服務端自動完成,應用層無感 | 僅支援縱向(組織)分片,靈活度有限 |
| 效能影響極小,海量資料亦適用 | 基礎表結構變更需同步重建視圖 |
| 組織架構調整時需重新配置分片編號 |
SYS_CONTEXT 替代 USERENV('CLIENT_INFO'),提升可維護性與安全性。JOIN 或 IN 提升執行計劃穩定性。