DBMS_RLS系統包提供了向表添加細粒度訪問控制策略的支持,能夠靈活地隔離數據。
DBMS_RLS子程序總覽
子程序 | 說明 |
ADD_POLICY Procedure | 向表添加細粒度的訪問控制策略。 |
ENABLE_POLICY Proceduree | 啟用或禁用一個細粒度的訪問控制策略。 |
DROP_POLICY Procedure | 從表中刪除細粒度的訪問控制策略。 |
ADD_POLICY Procedure
該存儲過程用于向表中添加細粒度的訪問控制策略。
語法
DBMS_RLS.ADD_POLICY (
object_schema IN VARCHAR2 DEFAULT NULL,
object_name IN VARCHAR2,
policy_name IN VARCHAR2,
function_schema IN VARCHAR2 DEFAULT NULL,
policy_function IN VARCHAR2,
statement_types IN VARCHAR2 DEFAULT NULL,
update_check IN BOOLEAN DEFAULT FALSE,
enable IN BOOLEAN DEFAULT TRUE,
static_policy IN BOOLEAN DEFAULT FALSE,
policy_type IN BINARY_INTEGER DEFAULT NULL,
long_predicate IN BOOLEAN DEFAULT FALSE,
sec_relevant_cols IN VARCHAR2 DEFAULT NULL,
sec_relevant_cols_opt IN BINARY_INTEGER DEFAULT NULL);
參數說明
參數 | 說明 |
object_schema | (可選參數)包含表的模式。如果沒有指定 |
object_name | 待添加策略的表的名稱。 |
policy_name | 待添加的策略名稱。對于同一個表,它必須是唯一的。 |
function_schema | (可選參數)策略函數的模式(NULL表示使用當前默認的模式)。如果沒有指定 |
policy_function | 為策略生成謂詞的函數的名稱。如果函數是在包中定義的,那么包的名稱必須存在。 |
statement_types | (可選參數)策略適用的語句類型。它可以是任意組合 |
update_check | (可選參數)對于 |
enable | (可選參數)指示添加時是否啟用該策略。默認值為TRUE。 |
static_policy | (可選參數)默認值為FALSE,如果設置為TRUE,則策略函數為訪問該對象的任何人生成相同的謂詞字符串。PolarDB僅做參數兼容。 |
policy_type | (可選參數)默認值為NULL,表示policy_type由static_policy的值決定。指定policy類型后,會覆蓋static_policy的值。PolarDB僅做參數兼容。 |
long_predicate | (可選參數)默認值為FALSE,表示策略函數可以返回長度最多為4000字節的謂詞。TRUE表示謂詞文本字符串的長度可以達到32K字節。PolarDB僅做參數兼容。 |
sec_relevant_cols | (可選參數)啟用列級虛擬隱私數據庫(VPD),在查詢中引用包含 |
sec_relevant_cols_opt | (可選參數)設置為 |
示例
該示例展示了如何添加一個新的訪問控制策略。
-- 創建測試表
CREATE TABLE t(a int, b int);
INSERT INTO t VALUES (1, 2);
INSERT INTO t VALUES (10, 20);
INSERT INTO t VALUES (100, 200);
-- 創建策略函數
CREATE OR REPLACE FUNCTION f(obj_schema varchar2, obj_name varchar2)
RETURN varchar2 IS
BEGIN
RETURN 'a < 10';
END;
-- 添加策略
BEGIN
DBMS_RLS.ADD_POLICY(object_name => 't',
policy_name => 'p',
policy_function => 'f',
statement_types => 'select',
sec_relevant_cols => 'b',
sec_relevant_cols_opt => DBMS_RLS.ALL_ROWS);
END;
-- 查詢數據,在 a<10 時會顯示 b,其他行的 b 不顯示
SELECT * FROM t ORDER BY b;
a | b
-----+---
1 | 2
10 |
100 |
(3 rows)
ENABLE_POLICY Procedure
該存儲過程用于啟用/禁用一個細粒度的訪問控制策略。
語法
DBMS_RLS.ENABLE_POLICY (
object_schema IN VARCHAR2 NULL,
object_name IN VARCHAR2,
policy_name IN VARCHAR2,
enable IN BOOLEAN TRUE);
參數說明
參數 | 說明 |
object_schema | (可選參數)包含表的模式。如果沒有指定 |
object_name | 待啟用/禁用策略所在表的名稱。 |
policy_name | 待啟用/禁用的策略名稱。 |
enable | 啟用或禁用該策略。取值如下:
|
示例
該示例展示了如何啟用/禁用策略。
-- 禁用策略
BEGIN
DBMS_RLS.ENABLE_POLICY(object_name => 't',
policy_name => 'p',
enable => 'f');
END;
-- 查詢數據,a b 均完整顯示
SELECT * FROM t ORDER BY b;
a | b
-----+-----
1 | 2
10 | 20
100 | 200
(3 rows)
-- 啟用策略
BEGIN
DBMS_RLS.ENABLE_POLICY(object_name => 't',
policy_name => 'p',
enable => 't');
END;
-- 查詢數據,在 a<10 時會顯示 b,其他行的 b 不顯示
SELECT * FROM t ORDER BY b;
a | b
-----+---
1 | 2
10 |
100 |
(3 rows)
DROP_POLICY Procedure
該存儲過程用于刪除表中的細粒度訪問控制策略。
語法
DBMS_RLS.DROP_POLICY (
object_schema IN VARCHAR2 NULL,
object_name IN VARCHAR2,
policy_name IN VARCHAR2);
參數說明
參數 | 說明 |
object_schema | (可選參數)包含表的模式。如果沒有指定 |
object_name | 待刪除策略所在表的名稱。 |
policy_name | 待刪除的策略名稱。 |
示例
該示例展示了如何刪除指定的策略。
-- 刪除策略
BEGIN
DBMS_RLS.DROP_POLICY(object_name => 't',
policy_name => 'p');
END;
-- 查詢數據,a b 均完整顯示
SELECT * FROM t ORDER BY b;
a | b
-----+-----
1 | 2
10 | 20
100 | 200
(3 rows)