本文聚焦 OLS 實際部署場景,通過標準 PL/SQL 包(`SA_USER_ADMIN`、`SA_POLICY_ADMIN`、`SA_LABEL_ADMIN`)演示用戶級、行級、列級、表級標籤授權的完整操作流程,含代碼模板與常見錯誤規避。
BEGIN
-- 授予用戶讀/寫/默認標籤
SA_USER_ADMIN.SET_USER_LABELS(
policy_name => 'HR_SEC',
user_name => 'SCOTT',
max_read_label => 'HS:P1:G1', -- 最高讀權限
max_write_label => 'S:P1:G1', -- 最高寫權限
def_label => 'S:P1:G1', -- 會話默認標籤
row_label => 'S:P1:G1' -- 新行默認標籤
);
-- 授予特權(可選)
SA_USER_ADMIN.SET_USER_PRIVS(
policy_name => 'HR_SEC',
user_name => 'SCOTT',
privileges => 'READ' -- 或 'WRITEUP'/'WRITEDOWN'/'COMPACCESS'/'FULL'
);
END;
/
關鍵規則:
BEGIN
SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
policy_name => 'HR_SEC',
schema_name => 'HR',
table_name => 'EMPLOYEES',
default_options => 'READ_CONTROL,WRITE_CONTROL,CHECK_CONTROL'
);
END;
/
執行後表自動增加隱含列 `ORA_ROW_LABEL` (NUMBER),存儲數字標籤標識。
INSERT INTO HR.EMPLOYEES (EMP_ID, NAME, SALARY, ORA_ROW_LABEL)
VALUES (999, 'TEMP', 5000,
CHAR_TO_LABEL('HR_SEC', 'S:P1:G1') -- 字符串轉數字標籤
);
若省略 `ORA_ROW_LABEL`,默認使用會話行標籤(`SA_USER_ADMIN.SET_USER_LABELS` 的 `row_label` 參數)。
BEGIN
SA_POLICY_ADMIN.APPLY_TABLE_POLICY(
policy_name => 'HR_SEC',
schema_name => 'HR',
table_name => 'EMPLOYEES',
label_column => 'SEC_LABEL', -- 顯式標籤列名(可選)
default_options => 'READ_CONTROL,WRITE_CONTROL'
);
-- 為敏感列單獨綁定標籤
SA_POLICY_ADMIN.SET_COLUMN_LABEL(
policy_name => 'HR_SEC',
schema_name => 'HR',
table_name => 'EMPLOYEES',
column_name => 'SALARY',
label => 'HS:P1:G1' -- 僅 HS 級用戶可讀薪資
);
SA_POLICY_ADMIN.SET_COLUMN_LABEL(
policy_name => 'HR_SEC',
schema_name => 'HR',
table_name => 'EMPLOYEES',
column_name => 'SSN',
label => 'HS:P1:G1'
);
END;
/
效果:`SELECT SALARY` 時自動檢查用戶讀標籤是否滿足 `HS:P1:G1`,不滿足返回 `NULL` 或報錯(視 `READ_CONTROL` 選項)。
將所有列綁定相同標籤,等價於表級保護:
BEGIN
FOR col IN (SELECT column_name FROM all_tab_columns WHERE owner='HR' AND table_name='EMPLOYEES') LOOP
SA_POLICY_ADMIN.SET_COLUMN_LABEL(
policy_name => 'HR_SEC',
schema_name => 'HR',
table_name => 'EMPLOYEES',
column_name => col.column_name,
label => 'S:P1:G1'
);
END LOOP;
END;
/
優勢:節省行級標籤存儲空間(無 `ORA_ROW_LABEL`),查詢時無需逐行比對標籤,性能最優。
| 限制項 | 規則 |
|---|---|
| 每表策略數 | 最多 1 個 |
| 每列策略數 | 最多 1 個(屬於表策略) |
| 行級標籤列 | 每表最多 1 個 (`ORA_ROW_LABEL`) |
| 標籤字符串長度 | ≤ 4000 字符 |
| 標籤大小寫 | 不敏感,存儲統一大寫 |
-- 查看用戶授權
SELECT * FROM DBA_SA_USER_LABELS WHERE POLICY_NAME='HR_SEC';
-- 查看表策略
SELECT * FROM DBA_SA_TABLE_POLICIES WHERE POLICY_NAME='HR_SEC';
-- 查看列標籤
SELECT * FROM DBA_SA_COLUMN_LABELS WHERE POLICY_NAME='HR_SEC';
-- 測試用戶 SCOTT 會話
CONN SCOTT/tiger
SELECT * FROM HR.EMPLOYEES; -- 自動按標籤過濾