すべてのプロダクト
Search
ドキュメントセンター

PolarDB:DBMS_RLS

最終更新日:Mar 29, 2026

DBMS_RLS パッケージは、PolarDB データベースオブジェクトで仮想プライベートデータベース (VPD) を有効にします。VPD は、コード変更を必要とせずに、すべてのアプリケーションで透過的に適用される行レベルのきめ細かなアクセス制御を提供します。

PolarDB は、Oracle DBMS_RLS パッケージのサブセットを実装しています。以下のストアドプロシージャがサポートされています。

ストアドプロシージャ説明
ADD_POLICY(object_schema, object_name, policy_name, function_schema, policy_function [, statement_types [, update_check [, enable [, static_policy [, policy_type [, long_predicate [, sec_relevant_cols [, sec_relevant_cols_opt ]]]]]]]]]])データベースオブジェクトにセキュリティポリシーを追加します。
DROP_POLICY(object_schema, object_name, policy_name)データベースオブジェクトからセキュリティポリシーを削除します。
ENABLE_POLICY(object_schema, object_name, policy_name, enable)セキュリティポリシーを有効または無効にします。

VPD の仕組み

セキュリティポリシーは、ポリシー関数とデータベースオブジェクト (通常はテーブル) の間の関連付けです。SQL ステートメントがそのオブジェクトにアクセスすると、データベースエンジンはポリシー関数を呼び出し、それが返す WHERE 句述語を取得し、それを AND 条件としてステートメントに追加します。述語を満たさない行は、結果セットからフィルタリングされます。

VPD は、標準のオブジェクトレベルの権限と比較して、いくつかの利点を提供します。

  • 行レベルの制御:GRANT ベースの権限はテーブル全体へのアクセスを制御します。VPD は個々の行へのアクセスを制限します。

  • ステートメント固有のポリシー:INSERT、UPDATE、DELETE、および SELECT 操作に対して異なるポリシーを適用します。

  • 動的な適用:ポリシーはステートメントごとに評価され、セッションユーザーなどの要因に基づいて異なる場合があります。

  • 透過的な適用:新しいアプリケーションを含むすべてのアプリケーションは、コード変更なしでポリシーの対象となります。

  • バイパスパスなし:スーパーユーザーであっても、EXEMPT ACCESS POLICY システム権限が明示的に付与されていない限り、アクティブなポリシーを回避することはできません。

説明 セキュリティポリシーをバイパスする唯一の方法は、EXEMPT ACCESS POLICY システム権限を保持することです。この権限を持つユーザーは、データベース内のすべてのポリシーから除外されます。この権限は慎重に付与してください。

ポリシー関数

ポリシー関数は、セキュリティポリシーのルールを定義します。以下の要件を満たす必要があります。

  • VARCHAR2 型の入力パラメーターを 2 つ持ちます。1 つ目はスキーマ名用、2 つ目はデータベースオブジェクト名用です。

  • VARCHAR2 型の戻り値の型を持ちます。

  • 有効な WHERE 句述語の形式で文字列を返します。

PolarDB では、ポリシー関数はデータベースがサポートする任意の言語 (Oracle-compatible SPL、SQL、または PL/pgSQL) で記述できます。

説明 VPD はテーブルのみをサポートします。ポリシーはビューまたはシノニムには適用できません。

VPD の実装

テーブルに VPD を実装するには、次の手順を実行します。

  1. セッションコンテキストまたはその他の条件に基づいて WHERE 句述語を返すポリシー関数を作成します。

  2. ADD_POLICY を使用して関数をテーブルに関連付け、適用する SQL ステートメントのタイプを指定します。

  3. ENABLE_POLICY を使用して、作成後にいつでもポリシーを有効または無効にします。

  4. 不要になったポリシーを削除するには、DROP_POLICY を使用します。ポリシーを削除しても、ポリシー関数やデータベースオブジェクトは削除されません。

ポリシーを作成した後、Oracle データベースと互換性のあるカタログビューをクエリして、どのアクティブなポリシーがあるかを確認します。

SYS_CONTEXT

SYS_CONTEXT 関数は、現在のセッションに関する情報を返すためにポリシー関数内で一般的に使用されます。構文:

SYS_CONTEXT(namespace, attribute)

パラメーター:

`namespace` — VARCHAR2。唯一の有効な値は USERENV です。その他の値は NULL を返します。

`attribute` — VARCHAR2。サポートされている値:

属性値同等の PostgreSQL 値
SESSION_USERpg_catalog.session_user
CURRENT_USERpg_catalog.current_user
CURRENT_SCHEMApg_catalog.current_schema
HOSTpg_catalog.inet_host
IP_ADDRESSpg_catalog.inet_client_addr
SERVER_HOSTpg_catalog.inet_server_addr
説明 PolarDB は SYS_CONTEXTUSERENV 名前空間での特殊な使用をサポートしていますが、アプリケーションコンテキストはサポートしていません。

サンプルテーブルの設定

このトピックの例では、emp テーブルの変更されたコピーである vpemp という名前のテーブルを使用します。テーブルと salesmgr ロールを作成するには、以下を実行します。

CREATE TABLE public.vpemp AS SELECT empno, ename, job, sal, comm, deptno FROM emp;
ALTER TABLE vpemp ADD authid VARCHAR2(12);
UPDATE vpemp SET authid = 'researchmgr' WHERE deptno = 20;
UPDATE vpemp SET authid = 'salesmgr' WHERE deptno = 30;
SELECT * FROM vpemp;

出力:

 empno | ename  |    job    |   sal   |  comm   | deptno |   authid
-------+--------+-----------+---------+---------+--------+-------------
  7782 | CLARK  | MANAGER   | 2450.00 |         |     10 |
  7839 | KING   | PRESIDENT | 5000.00 |         |     10 |
  7934 | MILLER | CLERK     | 1300.00 |         |     10 |
  7369 | SMITH  | CLERK     |  800.00 |         |     20 | researchmgr
  7566 | JONES  | MANAGER   | 2975.00 |         |     20 | researchmgr
  7788 | SCOTT  | ANALYST   | 3000.00 |         |     20 | researchmgr
  7876 | ADAMS  | CLERK     | 1100.00 |         |     20 | researchmgr
  7902 | FORD   | ANALYST   | 3000.00 |         |     20 | researchmgr
  7499 | ALLEN  | SALESMAN  | 1600.00 |  300.00 |     30 | salesmgr
  7521 | WARD   | SALESMAN  | 1250.00 |  500.00 |     30 | salesmgr
  7654 | MARTIN | SALESMAN  | 1250.00 | 1400.00 |     30 | salesmgr
  7698 | BLAKE  | MANAGER   | 2850.00 |         |     30 | salesmgr
  7844 | TURNER | SALESMAN  | 1500.00 |    0.00 |     30 | salesmgr
  7900 | JAMES  | CLERK     |  950.00 |         |     30 | salesmgr
(14 rows)
CREATE ROLE salesmgr WITH LOGIN PASSWORD 'password';
GRANT ALL ON vpemp TO salesmgr;

ADD_POLICY

ポリシー関数をデータベースオブジェクトに関連付けて、セキュリティポリシーを作成します。

スーパーユーザー権限が必要です。

ADD_POLICY(
  object_schema    VARCHAR2,
  object_name      VARCHAR2,
  policy_name      VARCHAR2,
  function_schema  VARCHAR2,
  policy_function  VARCHAR2
  [, statement_types      VARCHAR2
  [, update_check         BOOLEAN
  [, enable               BOOLEAN
  [, static_policy        BOOLEAN
  [, policy_type          INTEGER
  [, long_predicate       BOOLEAN
  [, sec_relevant_cols    VARCHAR2
  [, sec_relevant_cols_opt INTEGER ]]]]]]]])

パラメーター

`object_schema`

ポリシーが適用されるデータベースオブジェクトを含むスキーマの名前。

`object_name`

データベースオブジェクトの名前。特定のデータベースオブジェクトには、複数のポリシーを適用できます。

`policy_name`

ポリシーの名前。データベースオブジェクト (object_schemaobject_name で識別される) とポリシー名の組み合わせは、データベース内で一意である必要があります。

`function_schema`

ポリシー関数を含むスキーマ。

説明 ポリシー関数がパッケージに属している場合、function_schema はパッケージが定義されているスキーマである必要があります。

`policy_function`

ポリシー関数の名前。同じ関数を複数のポリシーで参照できます。

説明 ポリシー関数がパッケージに属している場合は、ドット表記 (package_name.function_name) を使用します。

`statement_types`

ポリシーが適用される SQL ステートメントのタイプのカンマ区切りのリスト。有効な値: INSERTUPDATEDELETESELECT。デフォルト: INSERT,UPDATE,DELETE,SELECT

説明 PolarDB は INDEX ステートメントタイプを受け入れますが、無視します。ポリシーはインデックス操作には適用できません。

`update_check`

INSERT および UPDATE ステートメントにのみ適用されます。

  • TRUE に設定すると、ポリシーは新しく挿入された行と、更新された行の変更されたイメージにも適用されます。新しい行または変更された行がポリシー述語を満たさない場合、INSERT または UPDATE ステートメントは例外をスローし、行は挿入または変更されません。

  • FALSE に設定すると、ポリシーは新しく挿入された行または更新された行の変更されたイメージには適用されません。したがって、新しく挿入された行は、同じポリシーを呼び出す後続のステートメントの結果セットに表示されない場合があります。

デフォルト: FALSE

`enable`

  • TRUE に設定すると、ポリシーはすぐに有効になり、statement_types で指定されたステートメントタイプに適用されます。

  • FALSE に設定すると、ポリシーは作成されますが無効になります。後で有効にするには、ENABLE_POLICY を使用します。

デフォルト: TRUE

`static_policy`

Oracle では、TRUE に設定すると、ポリシー関数は最初の呼び出し時にデータベースオブジェクトごとに 1 回評価され、結果の述語は再利用のためにキャッシュされます。FALSE に設定すると、ポリシー関数は呼び出しごとに再評価されます。

説明 PolarDB は常に動的ポリシー評価を使用します。static_policy パラメーターは受け入れられますが、無視されます。

デフォルト: FALSE

`policy_type`

Oracle では、ポリシー関数が再評価されるタイミングを決定します。NULL 以外の値に設定すると、static_policy をオーバーライドします。

説明 PolarDB は常に動的ポリシー評価を使用します。policy_type パラメーターは受け入れられますが、無視されます。

デフォルト: NULL

`long_predicate`

Oracle では、TRUE に設定すると、述語は最大 32 KB になります。それ以外の場合、述語は 4 KB に制限されます。

説明 PolarDB はこのパラメーターを無視します。ポリシー関数は無制限の長さの述語を返すことができます。

デフォルト: FALSE

`sec_relevant_cols`

object_name 内の列のカンマ区切りのリスト。指定した場合、SQL ステートメントがリストされた列の少なくとも 1 つを参照する場合にのみポリシーが適用されます。リストされた列が参照されない場合、ポリシーは適用されません。

デフォルト: NULL (すべての列をリストするのと同等)。

`sec_relevant_cols_opt`

Oracle では、DBMS_RLS.ALL_ROWS (整数値 1) に設定すると、すべての行が返されますが、ポリシー述語が false と評価される行の場合、sec_relevant_cols 列は NULL に設定されます。

説明 PolarDB は DBMS_RLS.ALL_ROWS をサポートしていません。sec_relevant_cols_opt1 に設定するとエラーがスローされます。

デフォルト: NULL

セッションユーザーによる行レベルのフィルタリング

このポリシー関数は、authid 列が現在のセッションユーザーと一致する行へのアクセスを制限します。

CREATE OR REPLACE FUNCTION verify_session_user (
    p_schema  VARCHAR2,
    p_object  VARCHAR2
)
RETURN VARCHAR2
IS
BEGIN
    RETURN 'authid = SYS_CONTEXT(''USERENV'', ''SESSION_USER'')';
END;

この関数は、authid = SYS_CONTEXT('USERENV', 'SESSION_USER') という述語を返します。これは、条件を満たす各 SQL ステートメントに AND 条件として動的に追加されます。

説明 SYS_CONTEXT は現在のセッションの属性を返します。USERENV は現在のセッションコンテキストを表す組み込みの名前空間です。PolarDB は USERENV を使用した SYS_CONTEXT をサポートしていますが、カスタムアプリケーションコンテキストはサポートしていません。

以下の匿名ブロックは、vpemp テーブルに secure_update という名前のポリシーを作成します。このポリシーは INSERT、UPDATE、および DELETE ステートメントに適用され、update_check が有効になっているため、新しく挿入または変更された行も述語を満たす必要があります。

DECLARE
    v_object_schema    VARCHAR2(30) := 'public';
    v_object_name      VARCHAR2(30) := 'vpemp';
    v_policy_name      VARCHAR2(30) := 'secure_update';
    v_function_schema  VARCHAR2(30) := 'polardb';
    v_policy_function  VARCHAR2(30) := 'verify_session_user';
    v_statement_types  VARCHAR2(30) := 'INSERT,UPDATE,DELETE';
    v_update_check     BOOLEAN      := TRUE;
    v_enable           BOOLEAN      := TRUE;
BEGIN
    DBMS_RLS.ADD_POLICY(
        v_object_schema,
        v_object_name,
        v_policy_name,
        v_function_schema,
        v_policy_function,
        v_statement_types,
        v_update_check,
        v_enable
    );
END;

salesmgr ユーザーとして接続し、SELECT を実行して現在のテーブルを確認します。

\c polardb salesmgr
Password for user salesmgr:
You are now connected to database "polardb" as user "salesmgr".
SELECT * FROM vpemp;

出力:

 empno | ename  |    job    |   sal   |  comm   | deptno |   authid
-------+--------+-----------+---------+---------+--------+-------------
  7782 | CLARK  | MANAGER   | 2450.00 |         |     10 |
  7839 | KING   | PRESIDENT | 5000.00 |         |     10 |
  7934 | MILLER | CLERK     | 1300.00 |         |     10 |
  7369 | SMITH  | CLERK     |  800.00 |         |     20 | researchmgr
  7566 | JONES  | MANAGER   | 2975.00 |         |     20 | researchmgr
  7788 | SCOTT  | ANALYST   | 3000.00 |         |     20 | researchmgr
  7876 | ADAMS  | CLERK     | 1100.00 |         |     20 | researchmgr
  7902 | FORD   | ANALYST   | 3000.00 |         |     20 | researchmgr
  7499 | ALLEN  | SALESMAN  | 1600.00 |  300.00 |     30 | salesmgr
  7521 | WARD   | SALESMAN  | 1250.00 |  500.00 |     30 | salesmgr
  7654 | MARTIN | SALESMAN  | 1250.00 | 1400.00 |     30 | salesmgr
  7698 | BLAKE  | MANAGER   | 2850.00 |         |     30 | salesmgr
  7844 | TURNER | SALESMAN  | 1500.00 |    0.00 |     30 | salesmgr
  7900 | JAMES  | CLERK     |  950.00 |         |     30 | salesmgr
(14 rows)

salesmgr として非修飾 UPDATE を発行します。

UPDATE 6

出力:

UPDATE 6

ポリシーは、authid = 'salesmgr' の行に UPDATE を制限し、セッションユーザーと一致させます。これらの 6 行のみが変更されます。

結果を確認します。

SELECT * FROM vpemp;

出力:

 empno | ename  |    job    |   sal   |  comm   | deptno |   authid
-------+--------+-----------+---------+---------+--------+-------------
  7782 | CLARK  | MANAGER   | 2450.00 |         |     10 |
  7839 | KING   | PRESIDENT | 5000.00 |         |     10 |
  7934 | MILLER | CLERK     | 1300.00 |         |     10 |
  7369 | SMITH  | CLERK     |  800.00 |         |     20 | researchmgr
  7566 | JONES  | MANAGER   | 2975.00 |         |     20 | researchmgr
  7788 | SCOTT  | ANALYST   | 3000.00 |         |     20 | researchmgr
  7876 | ADAMS  | CLERK     | 1100.00 |         |     20 | researchmgr
  7902 | FORD   | ANALYST   | 3000.00 |         |     20 | researchmgr
  7499 | ALLEN  | SALESMAN | 1600.00 | 1200.00 |     30 | salesmgr
  7521 | WARD   | SALESMAN | 1250.00 |  937.50 |     30 | salesmgr
  7654 | MARTIN | SALESMAN | 1250.00 |  937.50 |     30 | salesmgr
  7698 | BLAKE  | MANAGER   | 2850.00 | 2137.50 |     30 | salesmgr
  7844 | TURNER | SALESMAN | 1500.00 | 1125.00 |     30 | salesmgr
  7900 | JAMES  | CLERK    |  950.00 |  712.50 |     30 | salesmgr
(14 rows)

update_checkTRUE のため、authid = 'researchmgr' の行を挿入すると失敗します。これは、新しい行が salesmgr セッションユーザーのポリシー述語を満たさないためです。

INSERT INTO vpemp VALUES (9001,'SMITH','ANALYST',3200.00,NULL,20, 'researchmgr');

出力:

ERROR:  policy with check option violation
DETAIL:  Policy predicate was evaluated to FALSE with the updated values

update_checkFALSE に設定されている場合、同じ INSERT は成功します。

列レベルの VPD

sec_relevant_cols を使用して、特定の列が SQL ステートメントに表示される場合にのみポリシーを適用します。この例では、sal または comm が選択されたときに返される行を制限し、給与が 2000 未満の従業員のみを保持します。

CREATE OR REPLACE FUNCTION sal_lt_2000 (
    p_schema  VARCHAR2,
    p_object  VARCHAR2
)
RETURN VARCHAR2
IS
BEGIN
    RETURN 'sal < 2000';
END;

sec_relevant_cols'sal,comm' に設定してポリシーを作成します。

DECLARE
    v_object_schema     VARCHAR2(30) := 'public';
    v_object_name       VARCHAR2(30) := 'vpemp';
    v_policy_name       VARCHAR2(30) := 'secure_salary';
    v_function_schema   VARCHAR2(30) := 'polardb';
    v_policy_function   VARCHAR2(30) := 'sal_lt_2000';
    v_statement_types   VARCHAR2(30) := 'SELECT';
    v_sec_relevant_cols VARCHAR2(30) := 'sal,comm';
BEGIN
    DBMS_RLS.ADD_POLICY(
        v_object_schema,
        v_object_name,
        v_policy_name,
        v_function_schema,
        v_policy_function,
        v_statement_types,
        sec_relevant_cols => v_sec_relevant_cols
    );
END;

sal または comm を参照しないクエリは、14 行すべてを返します。ポリシーはトリガーされません。

SELECT empno, ename, job, deptno, authid FROM vpemp;

出力:

 empno | ename  |    job    | deptno |   authid
-------+--------+-----------+--------+-------------
  7782 | CLARK  | MANAGER   |     10 |
  7839 | KING   | PRESIDENT |     10 |
  7934 | MILLER | CLERK     |     10 |
  7369 | SMITH  | CLERK     |     20 | researchmgr
  7566 | JONES  | MANAGER   |     20 | researchmgr
  7788 | SCOTT  | ANALYST   |     20 | researchmgr
  7876 | ADAMS  | CLERK     |     20 | researchmgr
  7902 | FORD  | ANALYST   |     20 | researchmgr
  7499 | ALLEN  | SALESMAN |     30 | salesmgr
  7521 | WARD   | SALESMAN |     30 | salesmgr
  7654 | MARTIN | SALESMAN |     30 | salesmgr
  7698 | BLAKE  | MANAGER   |     30 | salesmgr
  7844 | TURNER | SALESMAN |     30 | salesmgr
  7900 | JAMES  | CLERK    |     30 | salesmgr
(14 rows)

sal または comm を含むクエリはポリシーをトリガーし、sal >= 2000 の行をフィルタリングします。

SELECT empno, ename, job, sal, comm, deptno, authid FROM vpemp;

出力:

 empno | ename  |   job    |   sal   |  comm   | deptno |   authid
-------+--------+----------+---------+---------+--------+-------------
  7934 | MILLER | CLERK    | 1300.00 |         |     10 |
  7369 | SMITH  | CLERK    |  800.00 |         |     20 | researchmgr
  7876 | ADAMS  | CLERK    | 1100.00 |         |     20 | researchmgr
  7499 | ALLEN  | SALESMAN | 1600.00 | 1200.00 |     30 | salesmgr
  7521 | WARD   | SALESMAN | 1250.00 |  937.50 |     30 | salesmgr
  7654 | MARTIN | SALESMAN | 1250.00 |  937.50 |     30 | salesmgr
  7844 | TURNER | SALESMAN | 1500.00 | 1125.00 |     30 | salesmgr
  7900 | JAMES  | CLERK    |  950.00 |  712.50 |     30 | salesmgr
(8 rows)

DROP_POLICY

データベースオブジェクトからセキュリティポリシーを削除します。ポリシーを削除しても、ポリシー関数やデータベースオブジェクト自体は削除されません。

スーパーユーザー権限が必要です。

DROP_POLICY(
  object_schema  VARCHAR2,
  object_name    VARCHAR2,
  policy_name    VARCHAR2
)

パラメーター

パラメーター説明
object_schemaポリシーが適用されるデータベースオブジェクトのスキーマ。
object_nameデータベースオブジェクトの名前。
policy_name削除するポリシーの名前。

public.vpemp テーブルから secure_update ポリシーを削除します。

DECLARE
    v_object_schema  VARCHAR2(30) := 'public';
    v_object_name    VARCHAR2(30) := 'vpemp';
    v_policy_name    VARCHAR2(30) := 'secure_update';
BEGIN
    DBMS_RLS.DROP_POLICY(
        v_object_schema,
        v_object_name,
        v_policy_name
    );
END;

ENABLE_POLICY

データベースオブジェクトの既存のセキュリティポリシーを有効または無効にします。

スーパーユーザー権限が必要です。

ENABLE_POLICY(
  object_schema  VARCHAR2,
  object_name    VARCHAR2,
  policy_name    VARCHAR2,
  enable         BOOLEAN
)

パラメーター

パラメーター説明
object_schemaポリシーが適用されるデータベースオブジェクトのスキーマ。
object_nameデータベースオブジェクトの名前。
policy_name有効または無効にするポリシーの名前。
enableポリシーを有効にするには TRUE に、無効にするには FALSE に設定します。

public.vpemp テーブルの secure_update ポリシーを無効にします:

DECLARE
    v_object_schema  VARCHAR2(30) := 'public';
    v_object_name    VARCHAR2(30) := 'vpemp';
    v_policy_name    VARCHAR2(30) := 'secure_update';
    v_enable         BOOLEAN      := FALSE;
BEGIN
    DBMS_RLS.ENABLE_POLICY(
        v_object_schema,
        v_object_name,
        v_policy_name,
        v_enable
    );
END;