DBMS_RLS パッケージを使用すると、Oracle データベースオブジェクトと互換性のある特定の POLARDB に Virtual Private Database を実装することができます。

表 1. 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 ]]]]]]]]) ストアドプロシージャ N/A データベースオブジェクトにセキュリティポリシーを追加します。
DROP_POLICY(object_schema, object_name, policy_name) ストアドプロシージャ N/A データベースオブジェクトからセキュリティポリシーを削除します。
ENABLE_POLICY(object_schema, object_name, policy_name, enable) ストアドプロシージャ N/A セキュリティポリシーを有効または無効にします。

Oracle 互換の POLARDB の DBMS_RLS パッケージは、Oracle のバージョンと比較すると部分的に実装されています。 Oracle 互換の POLARDB は、上表にリストされている関数とストアドプロシージャのみをサポートしています。

Virtual Private Database は、セキュリティポリシーを使用するきめの細かいアクセス制御を採用しています。 Virtual Private Database のきめ細かなアクセス制御とは、データへのアクセスを、セキュリティポリシーで定義された特定の行まで制御できることを意味します。

セキュリティポリシーをエンコードするルールは、ポリシー関数で定義されます。 このポリシー関数は、特定の入力パラメーターと戻り値を持つ SPL 関数です。 セキュリティポリシーは、ポリシー関数を特定のデータベースオブジェクト (通常はテーブル) に関連付けることです。

  • Oracle 互換の POLARDB では、ポリシー関数は、SQL、PL/pgSQL、SPL など、サポートされている任意の言語で記述することができます。 たとえば、Oracle 互換の SPL 言語の他に、SQL 言語や PL/pgSQL 言語も使用することができます。
  • Oracle 互換の POLARDB の Virtual Private Database は、1 種類のデータベースオブジェクト (テーブル) のみをサポートしています。 ポリシーはビューまたはシノニムには適用することができません。
Virtual Private Database を使用する利点は次のとおりです。
  • Virtual Private Database は、きめ細かいレベルのセキュリティを提供しています。 GRANT コマンドによって付与されるデータベースオブジェクトレベルの権限は、データベースオブジェクトのインスタンス全体へのアクセス権限を決定します。 対照的に、Virtual Private Database は、データベースオブジェクトインスタンスの個々の行に対するアクセスを制御できます。
  • SQL コマンドのタイプ (INSERT、UPDATE、DELETE、または SELECT) に応じて、異なるセキュリティポリシーを適用することができます。
  • セキュリティポリシーは動的であり、データベースオブジェクトに影響を与える適用可能な SQL コマンドごとに異なります。 セキュリティポリシーは、データベースオブジェクトにアクセスするアプリケーションのセッションユーザーなど、複数の要因によって決定されます。
  • セキュリティポリシーの呼び出しは、データベースオブジェクトにアクセスするすべてのアプリケーションに対して透過的です。 したがって、セキュリティポリシーを適用するために個々のアプリケーションを変更する必要はありません。
  • セキュリティポリシーを有効にすると、以下の注記に記載されているシステム権限を除いて、アプリケーション (新しいアプリケーションを含む) がセキュリティポリシーを回避することはできません。
  • スーパーユーザーであっても、以下の注記に記載されているシステム権限を除いて、セキュリティポリシーを回避することはできません。
セキュリティポリシーを回避する唯一の方法は、ユーザーに EXEMPT ACCESS POLICY システム権限を付与することです。 EXEMPT ACCESS POLICY 権限を持つユーザーは、データベース内のすべてのポリシーから除外されるため、この権限は細心の注意を払って付与する必要があります。

DBMS_RLS パッケージは、ポリシーを作成、削除、有効化、および無効化するためのストアドプロシージャを提供しています。

Virtual Private Database の実装プロセスは次のとおりです。
  • ポリシー関数を作成します。 この関数には、VARCHAR2 の型の 2 つの入力パラメーターが必要です。 最初の入力パラメーターは、ポリシーが適用されるデータベースオブジェクトを含むスキーマに使用されます。 2 番目の入力パラメーターは、データベースオブジェクトの名前に使用されます。 この関数の戻り値の型は VARCHAR2 である必要があります。 この関数は、WHERE 句の述語の形式で文字列を返す必要があります。 この述語は、データベースオブジェクトに作用する SQL コマンドに AND 条件として動的に追加されます。 ポリシー関数の述語を満たさない行は、SQL コマンドの結果セットから除外されます。
  • ADD_POLICY ストアドプロシージャを使用して、ポリシー関数をデータベースオブジェクトに関連付ける新しいポリシーを定義します。 ADD_POLICY ストアドプロシージャを使用して、ポリシーを適用する SQL コマンドのタイプ (INSERT、UPDATE、DELETE、または SELECT) を指定することができます。 作成時にポリシーを有効にするかどうかを指定することができます。 新しく挿入された行と更新された行の変更されたイメージにポリシーを適用できるかどうかを指定することもできます。
  • ENABLE_POLICY ストアドプロシージャを使用して、既存のポリシーを無効または有効にします。
  • DROP_POLICY ストアドプロシージャを使用して、既存のポリシーを削除します。 DROP_POLICY ストアドプロシージャは、ポリシー関数または関連するデータベースオブジェクトを削除しません。

ポリシーを作成すると、Oracle データベースと互換性のあるカタログビューで表示することができます。

SYS_CONTEXT 関数は、DBMS_RLS パッケージでよく使用されます。 構文は以下のとおりです。
SYS_CONTEXT(namespace, attribute)
			
  • namespace のデータ型は VARCHAR2 です。 有効な値は USERENV のみです。 このパラメーターに別の値が指定されている場合には、関数は NULL を返します。
  • attribute のデータ型は VARCHAR2 です。 下表に、属性パラメーターで使用可能な値を示します。
    属性の値 等価値
    SESSION_USER pg_catalog.session_user
    CURRENT_USER pg_catalog.current_user
    CURRENT_SCHEMA pg_catalog.current_schema
    HOST pg_catalog.inet_host
    IP_ADDRESS pg_catalog.inet_client_addr
    SERVER_HOST pg_catalog.inet_server_addr
DBMS_RLS パッケージの例では、Oracle 互換の POLARDB で提供されるサンプル emp テーブルの変更されたコピーを使用しています。 salesmgr という名前のロールには、テーブルに対するすべての権限が付与されます。 以下のように、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 ストアドプロシージャは、ポリシー関数をデータベースオブジェクトに関連付けることにより、新しいポリシーを作成します。

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 policy_name は、ポリシーに割り当てられた名前です。 データベースオブジェクト (object_schemaobject_name で識別) とポリシー名の組み合わせは、データベース内で一意である必要があります。
function_schema ポリシー関数を含むスキーマの名前です。
ポリシー関数はパッケージに属している場合があります。 この場合、function_schema には、パッケージが定義されているスキーマの名前が含まれている必要があります。
policy_function policy_function は、セキュリティポリシーのルールを定義する SPL 関数の名前です。 同じ関数を複数のポリシーで指定することができます。
ポリシー関数はパッケージに属している場合があります。 この場合、policy_function には、ドット表記のパッケージ名 (package_name.function_name) も含める必要があります。
statement_types statement_types は、ポリシーが適用される SQL コマンドをコンマで区切ったリストです。 有効な SQL コマンドは、INSERT、UPDATE、DELETE、および SELECT です。 デフォルト値は、INSERT, UPDATE, DELETE, SELECT です。
Oracle 互換の POLARDB は、INDEX を文の型として受け入れますが、無視されます。 ポリシーは、Oracle 互換の POLARDB の INDEX 操作には適用されません。
update_check update_check は、INSERT および UPDATE SQL コマンドにのみ適用されます。
  • update_check が TRUE に設定されている場合は、ポリシーは新しく挿入された行と更新された行の変更されたイメージに適用されます。 新規または変更された行がポリシー関数の述語に従って修飾されない場合には、INSERT または UPDATE コマンドは例外をスローし、行は挿入または変更されません。
  • update_check が FALSE に設定されている場合は、ポリシーは新しく挿入された行または更新された行の変更されたイメージには適用されません。 したがって、新しく挿入された行は、同じポリシーを呼び出す後続の SQL コマンドの結果セットに表示されない場合があります。 同様に、UPDATE コマンドの前にポリシーに従って修飾された行は、同じポリシーを呼び出す後続の SQL コマンドの結果セットに表示されない場合があります。
enable
  • enable を TRUE に設定すると、ポリシーが有効になり、statement_types パラメーターで指定された SQL コマンドに適用されます。
  • enable を FALSE に設定すると、ポリシーは無効になり、SQL コマンドには適用されません。 ENABLE_POLICY ストアドプロシージャを使用してポリシーを有効にすることができます。 デフォルト値は、TRUE です。
static_policy
  • Oracle では、static_policy が TRUE に設定されている場合、ポリシーは静的です。 ポリシー関数は、データベースオブジェクトのポリシーによって初めて呼び出されたときに、データベースオブジェクトごとに 1 回評価されます。 ポリシー関数の結果の述語文字列はメモリに保存されます。 この場合、述語文字列は、データベースサーバーインスタンスの実行中にそのデータベースオブジェクトに対するポリシーのすべての呼び出しで再利用することができます。
  • Oracle では、static_policy が FALSE に設定されている場合は、ポリシーは動的です。 ポリシー関数が再評価され、ポリシー関数の述語文字列が、ポリシーのすべての呼び出しに対して再生成されます。
  • デフォルト値は FALSE です。
  • Oracle 10g では、static_policy パラメーターを置き換えることを目的とした policy_type パラメーターが導入されました。 Oracle では、policy_type パラメーターがデフォルト値 (NULL) に設定されていない場合、policy_type パラメーター設定が static_policy 設定を上書きします。
  • Oracle 互換の POLARDB は、static_policy パラメーターの設定を無視します。 static_policy パラメーターの設定に関係なく、Oracle 互換の POLARDB は動的ポリシーのみを実装します。
policy_type Oracle では、policy_type でポリシー関数がいつ再評価されるかを決定します。 したがって、ポリシー関数によって返される述語文字列が変更されるかどうか、いつ変更されるかも決定されます。 デフォルト値は NULL です。
Oracle 互換の POLARDB は、policy_type パラメーターの設定を無視します。 Oracle 互換の POLARDB は、常に動的ポリシーを前提としています。
long_predicate Oracle では、long_predicate が TRUE に設定されている場合、述語の長さは最大 32 KB になります。 それ以外の場合、述語の長さは 4 KB に制限されます。 デフォルト値は FALSE です。
Oracle 互換の POLARDB は、long_predicate パラメーターの設定を無視します。 Oracle ポリシー関数と互換性のある POLARDB は、すべての実用的な用途のために無制限の長さの述語を返すことができます。
sec_relevant_cols sec_relevant_cols は、object_name の列のコンマ区切りリストです。 このパラメーターは、リストされた列に列レベルの Virtual Private Database を提供します。 リストされた列が statement_types で指定されたタイプの SQL コマンドで参照される場合、ポリシーが適用されます。 そのような列が参照されていない場合には、ポリシーは適用されません。

デフォルト値は NULL です。 データベースオブジェクトのすべての列が sec_relevant_cols に含まれている場合も、同じ効果が得られます。

sec_relevant_cols_opt Oracle では、sec_relevant_cols_optDBMS_RLS.ALL_ROWS (値 1 の INTEGER 定数) に設定されている場合、sec_relevant_cols にリストされている列は、適用されたポリシー述語が false であるすべての行で NULL を返します。 sec_relevant_cols_optDBMS_RLS.ALL_ROWS に設定されていない場合には、これらの行は結果セットで返されません。 デフォルト値は NULL です。
Oracle 互換の POLARDB は、DBMS_RLS.ALL_ROWS 関数をサポートしていません。 sec_relevant_cols_optDBMS_RLS.ALL_ROWS (INTEGER 値 1) に設定されている場合、Oracle 互換の POLARDB はエラーをスローします。

この例では、以下のポリシー関数を使用しています。

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') を生成します。この述語は、ADD_POLICY ストアードプロシージャで指定されたタイプの各 SQL コマンドの WHERE 句に追加されます。

これにより、SQL コマンドの効果は、authid 列の内容がセッションユーザーと同じである行に制限されます。

この例では、SYS_CONTEXT 関数を使用して、ログインユーザー名を返します。 Oracle では、SYS_CONTEXT 関数はアプリケーションコンテキストの属性を返します。 SYS_CONTEXT 関数の最初のパラメーターは、アプリケーションコンテキストの名前です。 2 番目のパラメーターは、アプリケーションコンテキスト内で設定された属性の名前です。 USERENV は、現在のセッションを記述する特別な組み込み名前空間です。 Oracle 互換の POLARDB はアプリケーションコンテキストをサポートしていませんが、SYS_CONTEXT 関数のこの特定の使用法をサポートしています。

以下の無名ブロックは、ADD_POLICY ストアドプロシージャを呼び出します。 これは、secure_update という名前のポリシーを作成するためのものです。 vpemp テーブルが参照される際、INSERT、UPDATE、または DELETE SQL コマンドが提供されているかどうかに関係なく、verify_session_user 関数を使用してポリシーが vpemp テーブルに適用されます。

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) := 'enterprisedb';
    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 ユーザーによってターミナルセッションが開始されます。 以下のクエリは、vpemp テーブルの内容を示しています。

edb=# \c edb salesmgr
Password for user newuser: 
You are now connected to database "mygpdb" as user "mygpdb".
> SELECT * FROM pet;
 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 コマンド (WHERE 句なし) を発行します。

edb=> UPDATE vpemp SET comm = sal * .75;
UPDATE 6

ポリシーは、テーブルのすべての行を更新する代わりに、更新の影響を authid 列に salesmgr 値が含まれる行に制限します。 salesmgr 値は、ポリシー関数述語によって指定されます。authid = SYS_CONTEXT ('USERENV', 'SESSION_USER')。

以下のクエリは、authid に salesmgr が含まれている行の comm 列が変更されたことを示しています。 他のすべての行は変更されません。

> SELECT * FROM pet;
 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)

以下の INSERT コマンドは、ADD_POLICY ストアドプロシージャで update_check パラメーターが TRUE に設定されているため、例外をスローします。 authid 列に指定された researchmgr 値が salesmgr セッションユーザーと一致しないため、ポリシーは無効です。

edb=> 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_check が FALSE に設定されていた場合、前述の INSERT コマンドは成功していました。

以下の例は、sec_relevant_cols パラメーターを使用して、SQL コマンドで特定の列が参照されている場合にのみポリシーを適用する方法を示しています。 この例では、以下のポリシー関数を使用しています。この関数は、従業員の給与が月額 USD 2,000 未満の行を選択します。

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

ポリシーは、SELECT コマンドに 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) := 'enterprisedb';
    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 列を参照しない場合には、ポリシーは適用されません。 以下のクエリは、vpemp テーブルの 14 行すべてを返します。

edb=# 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 以上の行を削除します。

edb=# 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 ストアドプロシージャは、既存のポリシーを削除します。 ただし、DROP_POLICY ストアドプロシージャは、ポリシー関数およびポリシーに関連付けられたデータベースオブジェクトを削除することはできません。

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 ストアドプロシージャは、指定されたデータベースオブジェクトの既存のポリシーを有効または無効にします。

ENABLE_POLICY ストアドプロシージャを実行するには、スーパーユーザーである必要があります。

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

パラメーター

パラメーター 説明
object_schema ポリシーが適用されるデータベースオブジェクトを含むスキーマの名前です。
object_name ポリシーが適用されるデータベースオブジェクトの名前です。
policy_name 有効または無効にするポリシーの名前です。
enable enable パラメーターを TRUE に設定すると、ポリシーが有効になります。 enable パラメーターが 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;