137 DBMS_RLS

DBMS_RLSパッケージには、ファイングレイン・アクセス・コントロールの管理インタフェースが含まれ、これを使用してVirtual Private Database (VPD)を実装します。

DBMS_RLSは、Enterprise Editionでのみ使用できます。

参照:

DBMS_RLSの使用方法については、『Oracle Databaseセキュリティ・ガイド』を参照してください。

この章のトピックは、次のとおりです:

137.1 DBMS_RLSの概要

ファイングレイン・アクセス・コントロールをサポートする機能は、動的な述語に基づいています。セキュリティ・ルールはビューに埋め込まれていませんが、元表またはビューがDML文で参照される、文の解析時に取得されます。

表、ビューまたはシノニムに対する動的な述語はPL/SQLファンクションが生成し、PL/SQLインタフェースを介してセキュリティ・ポリシーに関連付けられます。次に例を示します。

DBMS_RLS.ADD_POLICY (
   'hr', 'employees', 'emp_policy', 'hr', 'emp_sec', 'select', 'user_ctx', 'time');

HRスキーマの下にあるEMPLOYEES表が問合せまたは副問合せ(SELECT)で参照されるたびに、サーバーは、EMP_SECファンクション(HRスキーマの下にある)をコールします。このファンクションは、EMP_POLICYポリシーについて、現行のスキーマに固有の述語を戻します。ポリシー・ファンクションは、ファンクション・コール時に使用可能なセッション環境変数に基づいて述語を生成できます。これらの変数は通常、アプリケーション・コンテキストのフォームで表示されます。ポリシーでは、セキュリティ関連の列と、INDEXSELECTINSERTUPDATEDELETEなどの文を自由に組み合せて指定できます。

次に、サーバーは、テキストがある一時ビューを作成します。

SELECT * FROM hr.employees WHERE P1

ここで、P1(SAL > 10000や副問合せなど)は、EMP_SECファンクションから戻された述語です。サーバーは、EMPLOYEES表をビューとして処理し、ビューのテキストをデータ・ディクショナリからではなく一時ビューから取得すること以外は、通常のビューと同様にビューの展開を行います。

述語に副問合せがある場合は、ポリシー・ファンクションの所有者(定義者)を使用して副問合せ内のオブジェクトを解決し、そのオブジェクトのセキュリティをチェックします。つまり、ポリシー保護されたオブジェクトへのアクセス権限を持つユーザーには、ポリシーについての知識は不要です。このユーザーには、基礎となるセキュリティ・ポリシーに対するオブジェクト権限の付与は不要です。さらに、サーバーはファンクション定義者の権限でコールを行うため、このユーザーにはポリシー・ファンクションでのEXECUTE権限は不要です。

ノート:

一時ビューは、単一表または述語のみを持つビュー(つまり、JOINORDER BYGROUP BYなどがない)から導出されるため、親オブジェクトの更新可能性を保持できます。

DBMS_RLSは、セキュリティ・ポリシーを削除するか使用可能にするためのインタフェースも提供します。たとえば、EMP_POLICYを削除したり、使用可能にしたりする場合は、次のPL/SQL文を使用します。

DBMS_RLS.DROP_POLICY('hr', 'employees', 'emp_policy'); 
DBMS_RLS.ENABLE_POLICY('hr', 'employees', 'emp_policy', TRUE);

137.2 DBMS_RLSのセキュリティ・モデル

一時ビューが副問合せを使用して作成されると、セキュリティ・チェックが実行されます。ポリシー・ファンクションを持ち、動的な述語を生成するスキーマは、セキュリティ・チェックおよびオブジェクト検索を行う一時ビューの定義者です。

137.3 DBMS_RLSの定数

DBMS_RLSパッケージには、パラメータ値の指定に使用できる定数が含まれます。

表137-1 DBMS_RLSの定数

定数 タイプ 説明

ADD_ATTRIBUTE_ASSOCIATION

BINARY_INTEGER

1

DBMS_RLS.ALTER_POLICYおよびDBMS_RLS_ALTER_GROUPED_POLICYとともに使用し、指定したネームスペースと属性をポリシーまたはグループ化されたポリシーに追加します。

REMOVE_ATTRIBUTE_ASSOCIATION

BINARY_INTEGER

2

DBMS_RLS.ALTER_POLICYおよびDBMS_RLS.ALTER_GROUPED_POLICYとともに使用し、指定したネームスペースと属性をポリシーまたはグループ化されたポリシーから削除します。

137.4 DBMS_RLSの操作上のノート

DBMS_RLSプロシージャは、現行のDMLトランザクションがある場合は、操作前にコミットします。ただし、プロシージャがDDLイベント・トリガーの内部にある場合、プロシージャは最初にコミットを実行しません。DDLトランザクションでは、DBMS_RLSプロシージャはDDLトランザクションの一部となります。

たとえば、ユーザーはCREATE TABLEのトリガーを作成できます。トリガー内部で、ALTER TABLEを介して列を追加でき、DBMS_RLSを介してポリシーを追加できます。これらすべての操作は、それぞれがDDL文であっても、CREATE TABLEと同じトランザクション内にあります。CREATE TABLEは、トリガーが正常終了した場合のみ成功します。

現行のカーソルおよび対応する述語のビューはV$VPD_POLICIESから利用できます。

シノニムが参照できるのは、ビューまたは表のみです。

137.5 DBMS_RLSのルールおよび制限

VPDでは、長い識別子の使用がサポートされています。オブジェクト(表名、ポリシー名およびサブプログラム名)とビューに適用される、object_schemaobject_namepolicy_nameなどの引数の最大長は、128バイトです。

137.6 DBMS_RLSサブプログラムの要約

この表では、DBMS_RLSで使用可能なサブプログラムをリストし、簡単に説明します。

表137-2 DBMS_RLSパッケージのサブプログラム

サブプログラム 説明

ADD_GROUPED_POLICYプロシージャ

ポリシー・グループに関連付けられたポリシーを追加します。

ADD_POLICYプロシージャ

ファイングレイン・アクセス・コントロールのポリシーを表、ビューまたはシノニムに追加します。

ADD_POLICY_CONTEXTプロシージャ

アクティブなアプリケーションのコンテキストを追加します。

ALTER_POLICYプロシージャ

アプリケーション・コンテキスト属性をVPDポリシーに関連付けます。

ALTER_GROUPED_POLICYプロシージャ

アプリケーション・コンテキスト関連の変更を追加します。

CREATE_POLICY_GROUPプロシージャ

ポリシー・グループを作成します。

DELETE_POLICY_GROUPプロシージャ

ポリシー・グループを削除します。

DISABLE_GROUPED_POLICYプロシージャ

行レベルのグループ・セキュリティ・ポリシーを使用禁止にします。

DROP_GROUPED_POLICYプロシージャ

ポリシー・グループに関連付けられたポリシーを削除します。

DROP_POLICYプロシージャ

ファイングレイン・アクセス・コントロールのポリシーを表、ビューまたはシノニムから削除します。

DROP_POLICY_CONTEXTプロシージャ

駆動コンテキストが1つ少なくなるように、オブジェクトから駆動コンテキストを削除します。

ENABLE_GROUPED_POLICYプロシージャ

行レベルのグループ・セキュリティ・ポリシーを使用可能または使用禁止にします。

ENABLE_POLICYプロシージャ

ファイングレイン・アクセス・コントロールのポリシーを使用可能または使用禁止にします。

REFRESH_GROUPED_POLICYプロシージャ

リフレッシュ・ポリシーに関連付けられたSQL文を再解析します。

REFRESH_POLICYプロシージャ

ポリシーに関連付けられているすべてのキャッシュ済の文を再解析します。

137.6.1 ADD_GROUPED_POLICYプロシージャ

このプロシージャは、ポリシー・グループに関連付けられたポリシーを追加します。

構文

DBMS_RLS.ADD_GROUPED_POLICY(
   object_schema            IN  VARCHAR2        DEFAULT NULL,
   object_name              IN  VARCHAR2,
   policy_group             IN  VARCHAR2        DEFAULT 'SYS_DEFAULT',
   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,
   sec_relevant_cols_opt    IN  BINARY_INTEGER  DEFAULT NULL,
   namespace                IN  VARCHAR2        DEFAULT NULL,
   attribute                IN  VARCHAR2        DEFAULT NULL);

パラメータ

表137-3 ADD_GROUPED_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを追加する表、ビューまたはシノニムの名前。

policy_group

ポリシーが属するポリシー・グループの名前。

policy_name

ポリシーの名前。同一の表またはビューで一意である必要があります。

function_schema

ポリシー・ファンクションを所有するスキーマ。function_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

policy_function

ポリシーの述語を生成するファンクションの名前。ファンクションがパッケージ内で定義されている場合、パッケージ名は必ず存在する必要があります。

statement_types

ポリシーを適用する文タイプ。INDEXSELECTUPDATEまたはDELETEを任意に組み合せることができます。デフォルトでは、これらの中からINSERTINDEX以外のすべてのタイプが適用されます。

update_check

INSERT文およびUPDATE文の場合にかぎり、update_checkTRUEに設定すると、サーバーでポリシーがINSERT後またはUPDATE後の値に対してチェックされます。

チェックは、ポリシー定義に含まれているセキュリティ関連の列にのみ適用されます。つまり、ポリシーで定義されているセキュリティ関連の列がINSERTまたはUPDATE文で追加または更新された場合にのみ、INSERT操作またはUPDATE操作が失敗します。

enable

ポリシーの追加時に、そのポリシーを使用可能にするかどうかを示します。デフォルトはTRUEです。

static_policy

デフォルトはFALSEです。TRUEに設定されている場合は、オブジェクトにアクセスするすべてのユーザー(ただし、SYSまたはEXEMPT ACCESS POLICY権限を持つ特権ユーザーを除く)に対して、静的ポリシーのポリシー・ファンクションが同一の述語文字列を生成するものとサーバーはみなします。

policy_type

デフォルト値のNULLは、policy_typestatic_policyの値によって決定されることを意味します。使用可能なポリシー・タイプは、表137-5のとおりです。この中から指定したポリシー・タイプは、static_policyの値よりも優先されます。

long_predicate

デフォルト値のFALSEは、ポリシー・ファンクションから最大4000バイト長の述語が戻されることを意味します。TRUEは、述語のテキスト文字列の長さが最大32KBになることを意味します、このパラメータを使用できる前から存在するポリシーには、32K制限が維持されます。

sec_relevant_cols

列レベルのVirtual Private Database (VPD)を使用可能にします(このVPDによって、機密情報を保持している列が問合せで参照されたときにセキュリティ・ポリシーが実行されます)。表およびビューに適用されますが、シノニムには適用されません。ポリシーで保護されたオブジェクトについて、カンマ区切りまたはスペース区切りの有効な列名のリストを指定します。このポリシーが実行されるのは、ユーザーのSQL文またはその基礎となるビュー定義の中で、指定した列が参照されたとき(あるいは抽象データ・タイプの列の場合は、その属性が参照されたとき)のみです。デフォルトは、オブジェクトのユーザー定義列のすべてです。

namespace

アプリケーション・コンテキスト・ネームスペースを決定する名前。

attribute

アプリケーション・コンテキスト属性名を決定する属性。

使用上のノート

  • このプロシージャでは、指定した表、ビューまたはシノニムにポリシーが追加され、指定したポリシー・グループにそのポリシーが関連付けられます。

  • ポリシー・グループは、CREATE_POLICY_GROUPプロシージャを使用して作成する必要があります。

  • ポリシー名は、指定したオブジェクトのポリシー・グループ内で一意である必要があります。

  • デフォルトのポリシー・グループ(SYS_DEFAULT)のポリシーは、アクティブなポリシー・グループに関係なく常に実行されます。ただし、ファイングレイン・アクセス・コントロールのポリシーは、EXEMPT ACCESS POLICYシステム権限を持つユーザーには適用されません。

137.6.2 ADD_POLICYプロシージャ

このプロシージャは、ファイングレイン・アクセス・コントロールのポリシーを表、ビューまたはシノニムに追加します。

トランザクションがある場合、その現行のトランザクションはプロシージャによって操作の実行前にコミットを実行します。ただし、トランザクションがDDLイベント・トリガー内にある場合は、最初にコミットを実行しません。

コミットは、操作の最後にも実行されます。

構文

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,
   namespace                IN  VARCHAR2       DEFAULT NULL,
   attribute                IN  VARCHAR2       DEFAULT NULL); 

パラメータ

表137-4 ADD_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを追加する表、ビューまたはシノニムの名前。

policy_name

追加するポリシーの名前。同じ表またはビューでは固有の名前である必要があります。空白やカンマなどの特殊文字を入力しないでください。ポリシー名に特殊文字を使用する場合は、名前を引用符で囲みます。

function_schema

ポリシー・ファンクションを所有するスキーマ。function_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

policy_function

ポリシーの述語を生成するファンクションの名前。ファンクションがパッケージ内で定義されている場合、パッケージ名は必ず存在する必要があります。

statement_types

ポリシーを適用する文タイプ。INDEXSELECTUPDATEまたはDELETEを任意に組み合せることができます。デフォルトでは、これらの中からINSERTINDEX以外のすべてのタイプが適用されます。

update_check

文タイプINSERTまたはUPDATEに対するオプションの引数。デフォルトはFALSEです。文タイプINSERTを使用する場合は、update_checkTRUEに設定する必要があります。そうしない場合、ORA-28104 stringの入力値が無効ですというエラーが発生します。

チェックは、ポリシー定義に含まれているセキュリティ関連の列にのみ適用されます。つまり、ポリシーで定義されているセキュリティ関連の列がINSERTまたはUPDATE文で追加または更新された場合にのみ、INSERT操作またはUPDATE操作が失敗します。

enable

ポリシーの追加時に、そのポリシーを使用可能にするかどうかを示します。デフォルトはTRUEです。

static_policy

デフォルトはFALSEです。TRUEに設定されている場合、サーバーは、静的ポリシーのポリシー・ファンクションによって、オブジェクトにアクセスするすべてのユーザー(ただし、SYSまたはEXEMPT ACCESS POLICY権限を持つ特権ユーザーを除く)に対して同一の述語文字列が生成されるとみなします。

policy_type

デフォルト値のNULLは、policy_typestatic_policyの値によって決定されることを意味します。使用可能なポリシー・タイプは、表137-5のとおりです。この中から指定したポリシー・タイプは、static_policyの値よりも優先されます。

long_predicate

デフォルト値のFALSEは、ポリシー・ファンクションから最大4000バイト長の述語が戻されることを意味します。TRUEは、述語のテキスト文字列の長さが最大32KBになることを意味します、このパラメータを使用できる前から存在するポリシーには、32K制限が維持されます。

sec_relevant_cols

列レベルのVirtual Private Database (VPD)を使用可能にします(このVPDによって、機密情報を保持している列が問合せで参照されたときにセキュリティ・ポリシーが実行されます)。表およびビューに適用されますが、シノニムには適用されません。ポリシーで保護されたオブジェクトについて、カンマ区切りまたはスペース区切りの有効な列名のリストを指定します。このポリシーが実行されるのは、ユーザーのSQL文またはその基礎となるビュー定義の中で、指定した列が参照されたとき(あるいは抽象データ・タイプの列の場合は、その属性が参照されたとき)のみです。デフォルトは、オブジェクトのユーザー定義列のすべてです。

sec_relevant_cols_opt

sec_relevant_colsとともに使用して、列レベルのVPDでフィルタ処理をした問合せ(SELECTのみ)に関して、機密情報の列がNULLになっているすべての行を表示します。デフォルトではNULLに設定され、sec_relevant_colsで定義したフィルタが有効になります。dbms_rls.ALL_ROWSに設定するとすべての行が表示されますが、機密情報の列の値があると、列の値がsec_relevant_colsでフィルタ処理されるため、NULLが表示されます。このオプションに関する制限および追加情報は、使用上のノートを参照してください。

namespace

アプリケーション・コンテキスト・ネームスペースを決定する名前。

attribute

アプリケーション・コンテキスト属性名を決定する属性。

表137-5 DBMS_RLS.ADD_POLICYのポリシー・タイプ

ポリシー・タイプ 説明

STATIC

ランタイム環境にかかわらず、述語は同じになります。静的ポリシーの関数は一度だけ実行されてSGAにキャッシュされます。同じオブジェクトにアクセスする文の場合、ポリシー関数が再度実行されることはありません。ただし同じカーソルの実行ごとに、SYS_CONTEXTまたはSYSDATEなどの属性に基づいて述語がデータを別々にフィルタリングする場合があるため、同じ述語であっても別の行セットが生成される場合があります。1つのオブジェクトのみに適用されます。

SHARED_STATIC

同じポリシー・タイプの同一のポリシー・ファンクションにより生成されたキャッシュ済の述語が、最初にサーバーによって検索される点を除き、STATICと同じです。複数のオブジェクトで共有されます。

CONTEXT_SENSITIVE

最後にカーソルが使用されてからコンテキストが変更されていることが検出された場合、サーバーは文の実行時にポリシー・ファンクションを再評価します。複数のクライアントが1つのデータベース・セッションを共有するセッション・プーリングの場合、クライアント切り替え時に中間層でコンテキストをリセットする必要があります。サーバーは、このポリシー・タイプの関数により戻された値をキャッシュしません。サーバーは文の解析時にポリシー関数を実行します。1つのオブジェクトのみに適用されます。

SHARED_CONTEXT_SENSITIVE

同じデータベース・セッション内で、同じポリシー・タイプの同一のポリシー・ファンクションによって生成されたキャッシュ済の述語がサーバーにより最初に検索される点を除いて、CONTEXT_SENSITIVEと同じです。セッション・メモリー内に述語が存在する場合、ポリシー関数は再実行されず、セッションのプライベート・アプリケーション・コンテキストが変更されるまで、キャッシュされている値が有効になります。複数のオブジェクトで共有されます。

DYNAMIC

デフォルトのポリシー・タイプ。サーバーでは、どのようなシステム環境やセッション環境においても常になんらかの影響が述語にはあることを想定しているため、文の解析や実行のたびに必ずポリシー・ファンクションを再実行します。1つのオブジェクトのみに適用されます。

使用上のノート

  • SYSは、セキュリティ・ポリシーの制約を受けません。

  • ポリシー・ファンクションは、サーバーがコールします。次の例は、ファンクションのインタフェースを示します。

    FUNCTION policy_function (object_schema IN VARCHAR2, object_name VARCHAR2) 
        RETURN VARCHAR2 
    --- object_schema is the schema owning the table or view.
    --- object_name is the name of table, view, or synonym to which the policy applies. 
  • ポリシー・ファンクションには、WNDS(データベースへの書込み禁止状態)の純正レベルが必要です。

    参照:

    RESTRICT_REFERENCESプラグマの詳細は、『Oracle Database開発ガイド』を参照してください。

  • 同じオブジェクトにある複数のVPDポリシーから生成された述語は、全述語の論理積(AND条件)の結合効果があります。

  • セキュリティ・チェックおよびオブジェクト検索は、動的な述語の副問合せで、オブジェクトのポリシー・ファンクションの所有者に対して実行されます。

  • ファンクションが長さ0(ゼロ)の述語を戻す場合は、ポリシーについて現行のユーザーに適用する制限はないと解釈されます。

  • 述語で表の別名が必要な場合(たとえば、親オブジェクトが表タイプの場合)は、表またはビューの名前自体を別名として使用する必要があります。サーバーは次のような一時ビューを構成します。

    "select c1, c2, ... from tab tab where <predicate>"
     
  • 実行時にファンクションの妥当性チェックを行う目的は、インストールを容易にするため、およびインポート/エクスポート中に起こるその他の依存する問題を軽減するためです。

  • 列レベルのVPD列マスクの動作(sec_relevant_cols_opt => dbms_rls.ALL_ROWSで指定)は、行のサブセットのみを戻す他のすべてのVPDポリシーとは根本的に異なります。列マスクの動作では、ユーザーの問合せで指定されたすべての行を戻しますが、機密情報の列の値はNULLと表示されます。このオプションには次の制約があります。

    • SELECT文にのみ適用されます。

    • 通常のVPD述語とは異なり、このポリシー・ファンクションで生成するマスク条件は、単純なブール式にする必要があります。

    • アプリケーションで計算処理を実行し、また、計算結果にNULL値を想定しない場合は、列レベルのVPDのデフォルト動作を使用する必要があります。これはsec_relevant_colsパラメータで指定します。

    • このオプションとともにUPDATE AS SELECTを使用すると、表示を許可されている列の値のみが更新されます。

    • このオプションを使用すると表示されない行があります。次に例を示します。

      SELECT * FROM employees
      WHERE salary = 10
      

      列マスクのオプションが設定されているため、salary列からNULL値が戻された場合、この問合せでは行が戻らない可能性があります。

  • シノニムにVPDポリシーを追加すると、そのシノニムのすべての依存オブジェクト(シノニムを参照するポリシー・ファンクションを含む)がINVALIDとマークされます。

  • グローバル・アプリケーション・コンテキストを状況依存ポリシーまたは共有の状況依存ポリシーに関連付けることはできません。

  • 1つのオブジェクトに作成できるポリシーの最大数は255です。

2つの例の最初のものとして、次によってhr.employee表に適用されるポリシーが作成されます。これは列レベルのVPDポリシーで、SELECT文またはINDEX文が表のsalarybirthdateまたはSSN列を明示的に参照するか、ビューを使用して暗黙的に参照した場合にのみ実行されます。また、CONTEXT_SENSITIVEポリシーでもあるため、サーバーは、解析時にポリシー・ファンクションhr.hrfunを起動します。namespaceおよびattributeアプリケーション・コンテキスト・パラメータは、アプリケーション・コンテキスト値が変更された場合にのみ、ポリシー評価を制限します。実行中にファンクションが起動されるのは、いずれかのセッションのプライベート・コンテキストが文カーソルの最終使用時とは変わっている場合のみです。long_predicateパラメータはコールから除外されるため、ポリシー・ファンクションによって生成された述語が4000バイト(デフォルトの長さ制限)を超えないようにしてください。

BEGIN
   DBMS_RLS.ADD_POLICY(
      object_schema      => 'hr',
      object_name        => 'employee',
      policy_name        => 'hr_policy',
      function_schema    => 'hr',
      policy_function    => 'hrfun',
      statement_types    => 'select,index',
      policy_type        => DBMS_RLS.CONTEXT_SENSITIVE,
      sec_relevant_cols  => 'salary,birthdate,ssn',
      namespace          => 'empno_ctx',
      attribute          => 'emp_id');
END;

2番目の例では、次のコマンドによってホスティング用の同じオブジェクトに適用される別のポリシーが作成されるため、ユーザーは各自のサブスクライバIDに基づくデータのみにアクセスできます。これはSHARED_STATICポリシー・タイプとして定義されるため、サーバーはまずSGAキャッシュ内で述語の検索を試みます。検索できなかった場合、サーバーはポリシー・ファンクションsubfunの起動のみを行います。

BEGIN
   DBMS_RLS.ADD_POLICY(
      object_schema      => 'hr',
      object_name        => 'employee',
      policy_name        => 'hosting_policy',
      function_schema    => 'hr',
      policy_function    => 'subfun',
      policy_type        => dbms_rls.SHARED_STATIC);
END;

137.6.3 ADD_POLICY_CONTEXTプロシージャ

このプロシージャは、アクティブなアプリケーションのコンテキストを追加します。

構文

DBMS_RLS.ADD_POLICY_CONTEXT (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2,
   namespace       IN VARCHAR2,
   attribute       IN VARCHAR2); 

パラメータ

表137-6 ADD_POLICY_CONTEXTプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを追加する表、ビューまたはシノニムの名前。

namespace

アプリケーション・コンテキスト・ネームスペースを決定する名前。

attribute

アプリケーション・コンテキスト属性名を決定する属性。

使用上のノート

次の点に注意してください。

  • このプロシージャでは、ポリシーを実施するアプリケーション・コンテキストが示されます。このコンテキストは、実行するアプリケーションを決定します。

  • 駆動コンテキストはセッションにもグローバルにもできます。

  • 実行時、サーバーはこのコンテキストの値からアクティブなポリシー・グループの名前を取り出します。

  • ファイングレイン・アクセス・コントロールのポリシーを持つ各オブジェクトには、それぞれ少なくとも1つの駆動コンテキストを定義する必要があります。定義しない場合は、そのオブジェクトのすべてのポリシーが実行されます。

  • 複数のコンテキストを同一のオブジェクトに追加すると、複数のポリシー・グループのポリシーが施行されます。

  • 駆動コンテキストがNULLの場合は、すべてのポリシー・グループのポリシーが使用されます。

  • ポリシーを所有するポリシー・グループが駆動コンテキストである場合、そのポリシー・グループ内の使用可能なすべてのポリシーが、SYS_DEFAULTポリシー・グループの全ポリシーとともに適用されます。

  • ポリシーをaccess_control_groupグループのHR.EMPLOYEES表に追加するには、次のコマンドを発行します。

    DBMS_RLS.ADD_GROUPED_POLICY('hr','employees','access_control_group','policy1','SYS', 'HR.ACCESS');

137.6.4 ALTER_POLICYプロシージャ

このプロシージャは、アプリケーション・コンテキスト属性をVPDポリシーに関連付けます。

構文

DBMS_RLS.ALTER_POLICY (
   object_schema    IN VARCHAR2 DEFAULT NULL,
   object_name      IN VARCHAR2,
   policy_name      IN VARCHAR2,
   alter_option     IN NUMBER,
   namespace        IN VARCHAR2 DEFAULT NULL,
   attribute        IN VARCHAR2 DEFAULT NULL); 

パラメータ

表137-7 ALTER_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを追加する表、ビューまたはシノニムの名前。

policy_name

ポリシーの名前。同一の表またはビューで一意です。

alter_option

アプリケーション・コンテキストをOracle Virtual Private Databaseポリシーに追加するか、またはOracle Virtual Private Databaseポリシーから削除するかを指定するために使用されます。

namespace

アプリケーション・コンテキスト・ネームスペースを決定する名前。

attribute

アプリケーション・コンテキスト属性名を決定する属性。

使用上のノート

次の点に注意してください。

  • このプロシージャは、アプリケーション・コンテキスト・ネームスペースとアプリケーション・コンテキスト属性を、状況依存ポリシーまたは共有の状況依存ポリシーにのみ関連付けます。DYNAMICSTATICまたはSHARED_STATICポリシーでアプリケーション・コンテキスト・ネームスペースとアプリケーション・コンテキスト属性を指定すると、エラーが発生します。namespaceを指定した場合、プロシージャ・コールでattributeも指定する必要があります。

  • グローバル・アプリケーション・コンテキストを状況依存ポリシーまたは共有の状況依存ポリシーに関連付けることはできません。

  • 共有の状況依存VPDポリシーを変更するALTER_POLICYをコールすると、同一のVPDポリシー・ファンクションを持つすべての共有の状況依存VPDポリシーが影響を受けます。

  • 駆動コンテキストはセッションにもグローバルにもできます。

  • 実行時、サーバーはこのコンテキストの値からアクティブなポリシー・グループの名前を取り出します。

  • ファイングレイン・アクセス・コントロールのポリシーを持つ各オブジェクトには、それぞれ少なくとも1つの駆動コンテキストを定義する必要があります。定義しない場合は、そのオブジェクトのすべてのポリシーが実行されます。

  • 複数のコンテキストを同一のオブジェクトに追加すると、複数のポリシー・グループのポリシーが施行されます。

  • 駆動コンテキストがNULLの場合は、すべてのポリシー・グループのポリシーが使用されます。

  • ポリシーを所有するポリシー・グループが駆動コンテキストである場合、そのポリシー・グループ内の使用可能なすべてのポリシーが、SYS_DEFAULTポリシー・グループの全ポリシーとともに適用されます。

  • ポリシーをaccess_control_groupグループのhr.employees表に追加するには、次のコマンドを発行します。

    DBMS_RLS.ADD_GROUPED_POLICY(
       'hr','employees','access_control_group','policy1','SYS', 'HR.ACCESS');

137.6.5 ALTER_GROUPED_POLICYプロシージャ

このプロシージャは、アプリケーション・コンテキスト関連の変更を追加します。

構文

DBMS_RLS.ALTER_GROUPED_POLICY (
   object_schema    IN VARCHAR2 DEFAULT NULL,
   object_name      IN VARCHAR2,
   policy_group     IN VARCHAR2 DEFAULT SYS_DEFAULT,
   policy_name      IN VARCHAR2,
   alter_option     IN NUMBER,
   namespace        IN VARCHAR2 DEFAULT NULL,
   attribute        IN VARCHAR2 DEFAULT NULL); 

パラメータ

表137-8 ALTER_GROUPED_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを追加する表、ビューまたはシノニムの名前。

policy_group

ポリシーが属するポリシー・グループの名前。同一の表またはビューで一意である必要があります。

policy_name

ポリシーの名前。同一の表またはビューで一意です。

alter_option

アプリケーション・コンテキストをOracle Virtual Private Databaseポリシーに追加するか、またはOracle Virtual Private Databaseポリシーから削除するかを指定するために使用されます。

namespace

アプリケーション・コンテキスト・ネームスペースを決定する名前。

attribute

アプリケーション・コンテキスト属性名を決定する属性。

使用上のノート

次の点に注意してください。

  • このプロシージャは、アプリケーション・コンテキスト・ネームスペースとアプリケーション・コンテキスト属性を、状況依存ポリシーまたは共有の状況依存ポリシーにのみ関連付けます。DYNAMICSTATICまたはSHARED_STATICポリシーでアプリケーション・コンテキスト・ネームスペースとアプリケーション・コンテキスト属性を指定すると、エラーが発生します。namespaceを指定した場合、プロシージャ・コールでattributeも指定する必要があります。

  • グローバル・アプリケーション・コンテキストを状況依存ポリシーまたは共有の状況依存ポリシーに関連付けることはできません。

  • 共有の状況依存VPDポリシーを変更するALTER_GROUPED_POLICYをコールすると、同一のVPDポリシー・ファンクションを持つすべての共有の状況依存VPDポリシーが影響を受けます。

  • 駆動コンテキストはセッションにもグローバルにもできます。

  • 実行時、サーバーはこのコンテキストの値からアクティブなポリシー・グループの名前を取り出します。

  • ファイングレイン・アクセス・コントロールのポリシーを持つ各オブジェクトには、それぞれ少なくとも1つの駆動コンテキストを定義する必要があります。定義しない場合は、そのオブジェクトのすべてのポリシーが実行されます。

  • 複数のコンテキストを同一のオブジェクトに追加すると、複数のポリシー・グループのポリシーが施行されます。

  • 駆動コンテキストがNULLの場合は、すべてのポリシー・グループのポリシーが使用されます。

  • ポリシーを所有するポリシー・グループが駆動コンテキストである場合、そのポリシー・グループ内の使用可能なすべてのポリシーが、SYS_DEFAULTポリシー・グループの全ポリシーとともに適用されます。

  • ポリシーをaccess_control_groupグループのhr.employees表に追加するには、次のコマンドを発行します。

    DBMS_RLS.ADD_GROUPED_POLICY (
       'hr','employees','access_control_group','policy1','SYS', 'HR.ACCESS');

137.6.6 CREATE_POLICY_GROUPプロシージャ

このプロシージャはポリシー・グループを作成します。

構文

DBMS_RLS.CREATE_POLICY_GROUP (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2,
   policy_group    IN VARCHAR2); 

パラメータ

表137-9 CREATE_POLICY_GROUPプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを追加する表、ビューまたはシノニムの名前。

policy_group

ポリシーが属するポリシー・グループの名前

使用上のノート

グループは、各表または各ビューで一意である必要があります。

137.6.7 DELETE_POLICY_GROUPプロシージャ

このプロシージャはポリシー・グループを削除します。

構文

DBMS_RLS.DELETE_POLICY_GROUP (
  object_schema   IN VARCHAR2 NULL,
  object_name     IN VARCHAR2,
  policy_group    IN VARCHAR2); 

パラメータ

表137-10 DELETE_POLICY_GROUPプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを追加する表、ビューまたはシノニムの名前。

policy_group

ポリシーが属するポリシー・グループの名前

使用上のノート

次の点に注意してください。

  • このプロシージャでは、指定した表、ビューまたはシノニムのポリシー・グループが削除されます。

  • ポリシー・グループ内にポリシーを残さないでください。

137.6.8 DISABLE_GROUPED_POLICYプロシージャ

このプロシージャは、行レベルのグループ・セキュリティ・ポリシーを使用禁止にします。

構文

DBMS_RLS.DISABLE_GROUPED_POLICY (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2,
   group_name      IN VARCHAR2,
   policy_name     IN VARCHAR2); 

パラメータ

表137-11 DISABLE_GROUPED_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。

object_name

ポリシーを関連付ける表、ビューまたはシノニムの名前。

group_name

ポリシー・グループの名前。

policy_name

使用可能または使用禁止にするポリシーの名前。

使用上のノート

  • トランザクションがある場合、その現行のトランザクションはプロシージャによって操作の実行前にコミットを実行します。

  • コミットは、操作の最後に実行されます。

  • このプロシージャを実行するか、enableパラメータをFALSEに設定したENABLE_GROUPED_POLICYプロシージャを実行すると、ポリシーが使用禁止になります。

137.6.9 DROP_GROUPED_POLICYプロシージャ

ポリシー・グループに対応付けられたポリシーを削除します。

構文

DBMS_RLS.DROP_GROUPED_POLICY (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2,
   policy_group    IN VARCHAR2 'SYS_DEFAULT',
   policy_name     IN VARCHAR2); 

パラメータ

表137-12 DROP_GROUPED_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを削除する表、ビューまたはシノニムの名前。

policy_group

ポリシーが属するポリシー・グループの名前。

policy_name

ポリシー名

137.6.10 DROP_POLICYプロシージャ

このプロシージャは、ファイングレイン・アクセス・コントロールのポリシーを表、ビューまたはシノニムから削除します。

トランザクションがある場合、その現行のトランザクションはプロシージャによって操作の実行前にコミットを実行します。ただし、トランザクションがDDLイベント・トリガー内にある場合は、最初にコミットを実行しません。

コミットは、操作の最後にも実行されます。

構文

DBMS_RLS.DROP_POLICY (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2,
   policy_name     IN VARCHAR2); 

パラメータ

表137-13 DROP_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLが指定された場合は、現在のユーザーのスキーマと想定されます。

object_name

ポリシーを削除する表、ビューまたはシノニムの名前。

policy_name

表、ビューまたはシノニムから削除するポリシーの名前。

使用上のノート

  • シノニムからVPDポリシーを削除すると、そのシノニムのすべての依存オブジェクト(シノニムを参照するポリシー・ファンクションを含む)がINVALIDとマークされます。

137.6.11 DROP_POLICY_CONTEXTプロシージャ

このプロシージャは、駆動コンテキストが1つ少なくなるように、オブジェクトから駆動コンテキストを削除します。

構文

DBMS_RLS.DROP_POLICY_CONTEXT (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2,
   namespace       IN VARCHAR2,
   attribute       IN VARCHAR2); 

パラメータ

表137-14 DROP_POLICY_CONTEXTプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを削除する表、ビューまたはシノニムの名前。

namespace

駆動コンテキストのネームスペース

attribute

駆動コンテキストの属性

137.6.12 ENABLE_GROUPED_POLICYプロシージャ

このプロシージャは、行レベルのグループ・セキュリティ・ポリシーを使用可能または使用禁止にします。

構文

DBMS_RLS.ENABLE_GROUPED_POLICY (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2,
   group_name      IN VARCHAR2,
   policy_name     IN VARCHAR2,
   enable          IN BOOLEAN TRUE); 

パラメータ

表137-15 ENABLE_GROUPED_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを関連付ける表、ビューまたはシノニムの名前。

group_name

ポリシー・グループの名前。

policy_name

使用可能または使用禁止にするポリシーの名前。

enable

TRUEに設定するとポリシーが使用可能になり、FALSEに設定すると使用禁止になります。

使用上のノート

  • トランザクションがある場合、その現行のトランザクションはプロシージャによって操作の実行前にコミットを実行します。

  • コミットは、操作の最後に実行されます。

  • ポリシーは、その作成時に使用可能になっています。

137.6.13 ENABLE_POLICYプロシージャ

このプロシージャは、ファイングレイン・アクセス・コントロールのポリシーを使用可能または使用禁止にします。ポリシーは、その作成時に使用可能になっています。

トランザクションがある場合、その現行のトランザクションはプロシージャによって操作の実行前にコミットを実行します。ただし、トランザクションがDDLイベント・トリガー内にある場合は、最初にコミットを実行しません。

コミットは、操作の最後にも実行されます。

構文

DBMS_RLS.ENABLE_POLICY (
   object_schema IN VARCHAR2 NULL,
   object_name   IN VARCHAR2,
   policy_name   IN VARCHAR2,
   enable        IN BOOLEAN TRUE);

パラメータ

表137-16 ENABLE_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを関連付ける表、ビューまたはシノニムの名前。

policy_name

使用可能または使用禁止にするポリシーの名前。

enable

ポリシーを使用可能にする場合はTRUE、使用禁止にする場合はFALSE

137.6.14 REFRESH_GROUPED_POLICYプロシージャ

このプロシージャは、リフレッシュ・ポリシーに関連付けられたSQL文を再解析します。

構文

DBMS_RLS.REFRESH_GROUPED_POLICY (
   object_schema   IN VARCHAR2 NULL,
   object_name     IN VARCHAR2 NULL,
   group_name      IN VARCHAR2 NULL,
   policy_name     IN VARCHAR2 NULL); 

パラメータ

表137-17 REFRESH_GROUPED_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを関連付ける表、ビューまたはシノニムの名前。

group_name

ポリシー・グループの名前。

policy_name

ポリシー名

使用上のノート

  • このプロシージャは、ポリシーに関連付けられたすべてのキャッシュ済の文を再解析します。これにより、ポリシーへの最新の変更内容がプロシージャの実行直後に有効になります。

  • トランザクションがある場合、その現行のトランザクションはプロシージャによって操作の実行前にコミットを実行します。

  • コミットは、操作の最後に実行されます。

  • 使用禁止になっているポリシーをリフレッシュしようとすると、プロシージャはエラーを戻します。

  • このプロシージャは、状況依存VPDポリシーと共有のVPDポリシーのキャッシュされた結果を削除します。

137.6.15 REFRESH_POLICYプロシージャ

このプロシージャは、ポリシーに関連付けられたすべてのキャッシュ済の文を再解析します。これにより、ポリシーへの最新の変更内容がプロシージャの実行直後に有効になります。

トランザクションがある場合、その現行のトランザクションはプロシージャによって操作の実行前にコミットを実行します。ただし、トランザクションがDDLイベント・トリガー内にある場合は、最初にコミットを実行しません。

コミットは、操作の最後にも実行されます。

構文

DBMS_RLS.REFRESH_POLICY (
   object_schema IN VARCHAR2 NULL,
   object_name   IN VARCHAR2 NULL,
   policy_name   IN VARCHAR2 NULL); 

パラメータ

表137-18 REFRESH_POLICYプロシージャのパラメータ

パラメータ 説明

object_schema

表、ビューまたはシノニムを含んでいるスキーマ。object_schemaが指定されていない場合、またはNULLの場合は、現在のスキーマが使用されます。

object_name

ポリシーを関連付ける表、ビューまたはシノニムの名前。

policy_name

リフレッシュするポリシーの名前

使用上のノート

  • 使用禁止になっているポリシーをリフレッシュしようとすると、プロシージャはエラーを戻します。

  • このプロシージャは、状況依存VPDポリシーと共有のVPDポリシーのキャッシュされた結果を削除します。