6 ラベル付きデータの処理
ラベル付きデータを管理し、セッションのセキュリティ属性のデータを表示し、セッション属性の値を変更できます。
ノート:
このマニュアルの多くの例では、HUMAN_RESOURCES
サンプル・ポリシーを使用しています。そのポリシー名はHR
で、ポリシー・ラベル列はHR_LABEL
です。特に明記していないかぎり、各例では、Oracle Label Securityポリシーの施行がすべて有効になっている状態で、ユーザーの認証の範囲内でSQL文が行に対して実行されるものとします。
- ポリシー・ラベル列とラベル・タグの動作
表またはスキーマ内でポリシー・ラベル列を作成して値を格納する方法を理解しておく必要があります。 - データ行へのラベルの割当て
既存のデータ行の場合は、ラベル付けファンクションを作成してラベルを割り当てることができます。 - ラベルの表示
ラベルの検索時に、文字列値を自動的に取得することはありません。 - ラベルを使用したデータのフィルタリング
Oracle Label Securityは、SQL文を処理するとき、作成および適用の手順で、データベースで定義されているセキュリティ・ポリシーを呼び出します。 - ラベル付きデータの挿入
様々な状況で、ラベル付きデータを挿入できます。 - セッション・ラベルと行ラベルの変更
セッション中、ユーザーは認可と管理者セットに基づいてラベルを変更できます。
親トピック: Oracle Label Securityの機能の使用
6.1 ポリシーのラベル列とラベル・タグの動作
表またはスキーマ内でポリシーのラベル列を作成して値を格納する方法を理解しておく必要があります。
親トピック: ラベル付きデータの処理
6.1.1 ポリシーのラベル列
ポリシー・ラベル列の使用方法を理解しておく必要があります。
- ポリシー・ラベル列について
表に適用される各ポリシーにより、データベースに1列が作成されます。 - ポリシー・ラベル列の非表示化
ポリシーを表す列を非表示にするように選択できます。
親トピック: ポリシーのラベル列とラベル・タグの動作
6.1.1.1 ポリシー・ラベル列について
表に適用される各ポリシーにより、データベースに1列が作成されます。
デフォルトのデータ型は、NUMBER
です。
ポリシーに関する各行のラベルは、文字列書式のラベル値と等価の数値を使用して、その列のタグで表されます。ラベル・タグは、ラベル作成時に管理者が手動で指定しないかぎり自動的に生成されます。
自動ラベル生成は、「データ・ラベルおよびユーザー・ラベル」で説明されているように、管理者がラベル・コンポーネントを定義するときに設定したルールに従って行われます。
ノート:
ポリシーの作成自体は、表やスキーマに影響しません。ポリシーは表またはスキーマにのみ適用されます。
親トピック: ポリシー・ラベル列
6.1.1.2 ポリシーのラベル列の非表示化
ポリシーを表す列を非表示にするように選択できます。
ノート:
マテリアライズド・ビュー内の列は非表示にできません。関連項目
親トピック: ポリシー・ラベル列
6.1.2 ラベル・タグ
ラベル・コンポーネントを定義するラベル・タグは、手動で作成することも、自動で生成することもできます。
- ラベル・タグについて
管理者は最初に、ポリシーに使用するラベル・コンポーネントのセットを定義します。 - 手動定義したラベル・タグによるラベルの順序付け
ラベル・タグを手動で定義すると、ラベルを意味のある方法でソートし比較できるようなデータ操作方法を実装できます。 - 手動定義したラベル・タグによるデータの操作
管理目的でラベル・タグを定義すると、ラベル文字列全体(つまり、ラベル・コンポーネントの組合せ)を簡単に参照できます。 - 自動生成されたラベル・タグ
動的に生成されるラベル・タグは10桁で、ラベル・コンポーネントに割り当てられている番号とは無関係です。
親トピック: ポリシーのラベル列とラベル・タグの動作
6.1.2.1 ラベル・タグについて
管理者は最初に、ポリシーに使用するラベル・コンポーネントのセットを定義します。
ラベルの作成時に、管理者はラベルを構成するコンポーネントの有効な組合せセット、つまり、オプションで1つ以上のグループまたは区分と組み合せたレベルを指定します。
ポリシー内で有効なこれらの各ラベルは、管理者により割り当てられた、または初回使用時に自動的に生成された、関連付けられている数値タグによって一意に識別されます。管理者がラベル・タグを手動で定義すると、ソートや論理比較を行うときのラベル値の順序付けを制御できるというメリットがあります。
ただし、ラベル・タグは、データベース内のすべてのポリシー間で一意であることが必要です。データベース内で複数のポリシーを使用する場合、異なるポリシー内で同じ数値ラベル・タグは使用できません。ラベル・タグはそれぞれが1つのラベルを一意に識別すること、およびデータ行に格納されるのはラベルの文字列表現ではなく、この数値タグであることに注意してください。
親トピック: ラベル・タグ
6.1.2.2 手動定義したラベル・タグによるラベルの順序付け
ラベル・タグを手動で定義すると、ラベルを意味のある方法でソートし比較できるようなデータ操作方法を実装できます。
そのためには、保護されたデータに関連付けるラベルをすべて事前に定義し、各ラベルに意味のあるラベル・タグ値を割り当てる必要があります。手動で割り当てることができるラベル・タグは8桁以内です。ラベル・タグの値は1以上である必要があります。
ラベル・タグ値をラベル・コンポーネントの数値に関連付ける方法を実装すると、メリットが得られる場合があります。これにより、タグを使用してデータ行を意味のある方法でグループ化できます。ただし、このアプローチは必須ではありません。機密性の高いラベルのタグは、機密性の低いラベルのタグより大きい数値に設定することをお薦めします。
表6-1に、割り当てられたラベル・タグのセットを示します。この例で、管理者の設定したラベル・タグ値が、「データ・ラベルおよびユーザー・ラベル」で説明したレベル、区分および行の数値に基づいていることに注意してください。
表6-1 管理者が定義したラベル・タグ(例)
ラベル・タグ | ラベル文字列 |
---|---|
10000 |
P |
20000 |
C |
21000 |
C:FNCL |
21100 |
C:FNCL,OP |
30000 |
S |
31110 |
S:OP:WR |
40000 |
HS |
42000 |
HS:OP |
この例では、PUBLIC
レベルのラベルは"1"、CONFIDENTIAL
レベルのラベルは"2"、SENSITIVE
レベルのラベルは"3"、HIGHLY_SENSITIVE
レベルのラベルは"4"で始まっています。
FINANCIAL
区分を持つラベルは1000番台、OP
区分を持つラベルは1100番台になっています。10の桁はグループWR
などを示します。
この他に、グループのみに基づく方法などもあります。その場合、タグは3110、3120、3130などとなります。
ただし、ラベル・タグは、個々のラベル・コンポーネントに割り当てられている数値にかかわらず、ラベル全体を識別します。ラベル・タグは、個別に評価される番号の集まりではなく、全体で1つの整数として使用されます。
親トピック: ラベル・タグ
6.1.2.3 手動定義したラベル・タグによるデータの操作
管理目的でラベル・タグを定義すると、ラベル文字列全体(つまり、ラベル・コンポーネントの組合せ)を簡単に参照できます。
たとえば、表6-1にあるように、タグ31110でラベル文字列S:OP:WR全体を表すことができます。
ラベル・タグは、データをパーティション化する便利な方法として使用できます。たとえば、範囲1000から1999内のラベルを持つすべてのデータを表領域Aに置き、範囲2000から2999内のラベルを持つすべてのデータを表領域Bに置くことができます。
この最も単純な表記法は、ラベル数が限られていて、それに対して各種操作を実行する必要がある場合にも役立ちます。ある会社が他の多数の会社の人事管理システムを管理している状況を考えます。会社YのユーザーはいずれもラベルC:ALPHA:CYを持ち、そのタグ210が設定されているとします。会社Yのアプリケーション・ユーザーの総数を判断するには、ホスト管理者は次のように入力します。
SELECT * FROM tab1 WHERE hr_label = 210;
親トピック: ラベル・タグ
6.2 データ行へのラベルの割当て
既存のデータ行の場合は、ラベル付けファンクションを作成してラベルを割り当てることができます。
このファンクションでは、挿入するラベルを定義する表と行の条件を正確に指定します。ファンクション名は、表またはスキーマにポリシーを適用するためのコール、または管理者によるUPDATE時に指定できます。
6.3 ラベルの表示
ラベルの検索時に、文字列値を自動的に取得することはありません。
デフォルトでは、ラベル・タグの値が戻されます。2つのラベル操作ファンクションを使用すると、ラベル・タグの値と文字列表現の間で変換できます。
- CHAR_TO_LABELを使用した文字列からラベル・タグへの変換
CHAR_TO_LABEL
ファンクションは、文字列をラベル・タグに変換し、指定した文字列のラベル・タグを戻します。 - LABEL_TO_CHARを使用したラベル・タグから文字列への変換
ラベル・タグを文字列に変換できます。
親トピック: ラベル付きデータの処理
6.3.1 CHAR_TO_LABELを使用した文字列からラベル・タグへの変換
CHAR_TO_LABEL
ファンクションは、文字列をラベル・タグに変換し、指定した文字列のラベル・タグを戻します。
-
文字列をラベル・タブに変換するには、次のような
CHAR_TO_LABEL
ファンクションの構文を使用します。FUNCTION CHAR_TO_LABEL ( policy_name IN VARCHAR2, label_string IN VARCHAR2) RETURN NUMBER;
たとえば:
INSERT INTO emp (empno,hr_label) VALUES (999, CHAR_TO_LABEL('HR','S:A,B:G5');
HR
はラベルのポリシー名、S
は機密性レベル、A,B
は区分、G5
はグループです。
FUNCTION CHAR_TO_LABEL ( policy_name IN VARCHAR2, label_string IN VARCHAR2) RETURN NUMBER;
HR
はラベルのポリシー名、S
は機密性レベル、A,B
は区分、G5
はグループです。
親トピック: ラベルの表示
6.3.2 LABEL_TO_CHARを使用したラベル・タグから文字列への変換
ラベル・タグを文字列に変換できます。
- LABEL_TO_CHARを使用したラベル・タグから文字列への変換
LABEL_TO_CHAR
ファンクションは、ラベル・タグを文字列を変換するときにVARCHAR2
文字列を戻します。 - LABEL_TO_CHARの例
Oracleでは、LABEL_TO_CHAR
の使用例が提供されています。 - ポリシー・ラベル列が非表示に設定されている場合の表からのすべての列の取出し
ポリシー・ラベル列が非表示になっている場合、表に対してSELECT *
を実行しても、列は自動的には戻されません。
親トピック: ラベルの表示
6.3.2.1 LABEL_TO_CHARを使用したラベル・タグから文字列への変換
LABEL_TO_CHAR
ファンクションは、ラベル・タグを文字列を変換するときにVARCHAR2
文字列を戻します。
表またはビューを問い合せて自動的に取得される行は、表またはビュー内の行のうち、問合せの修飾を満たし、問合せを行ったユーザーのラベルに支配される行すべてです。ポリシーのラベル列が非表示に設定されていない場合は、各行のラベル・タグ値が表示されます。各ラベルの文字列値を表示するには、LABEL_TO_CHAR
ファンクションを使用する必要があります。
すべての変換は明示的に行う必要があることに注意してください。タグと文字列表現の間の自動的なキャストはありません。
-
ラベル・タグを文字列に変換するには、次のような
LABEL_TO_CHAR
ファンクションの構文を使用します。FUNCTION LABEL_TO_CHAR ( label IN NUMBER) RETURN VARCHAR2;
6.3.2.2 LABEL_TO_CHARの例
Oracleでは、LABEL_TO_CHAR
の使用例が提供されています。
例: 表またはビューからの行ラベルの取得
表またはビューから行のラベルを取得するには、SELECT
文でポリシー・ラベル列を指定します。
たとえば:
SELECT label_to_char (hr_label) AS label, ename FROM tab1; WHERE ename = 'RWRIGHT';
この文では次のように戻されます。
LABEL ENAME ------------ ---------- S:A,B:G1 RWRIGHT
例: ポリシー・ラベル列の取得
SELECT
文のWHERE
句でポリシーのラベル列を指定することもできます。
次の文では、ポリシー・ラベルS:A,B:G1
を持つすべての行が表示されます。
SELECT label_to_char (hr_label) AS label,ename FROM emp WHERE hr_label = char_to_label ('HR', 'S:A,B:G1');
この文では次のように戻されます。
LABEL ENAME ------------- --------- S:A,B:G1 RWRIGHT S:A,B:G1 ESTANTON
また、次のように、より柔軟な文を使用して、HR_LABEL
列のテキストに文字列"S:A,B:G1"を含むデータを検索することもできます。
SELECT label_to_char (hr_label) AS label,ename FROM emp WHERE label_to_char (hr_label) like '%S:A,B:G1%';
LABEL_TO_CHAR
ファンクションを使用しない場合は、ラベル・タグが表示されます。
例: 数値列データ型の取得
次の例は、数値列データ型(NUMBER
)の動的に生成されたラベル・タグですが、LABEL_TO_CHAR
ファンクションを使用していません。LABEL_TO_CHAR
ファンクションを使用しない場合は、ラベル・タグが表示されます。
SQL> select empno, hr_label from emp where ename='RWRIGHT'; EMPNO HR_LABEL ---------- ---------- 7839 1000000562
6.3.2.3 ポリシーのラベル列が非表示に設定されている場合の表からのすべての列の取出し
ポリシー・ラベル列が非表示になっている場合、表に対してSELECT *
を実行しても、列は自動的には戻されません。
-
ラベルを取得することを明示的に指定するには、
SELECT
文でLABEL_TO_CHAR
ファンクションを使用します。
たとえば、DEPT
表からすべての列を(ポリシーのラベル列の文字列表現を含め)取り出すには、次のように入力します。
COLUMN LABEL FORMAT a10 SELECT LABEL_TO_CHAR (hr_label) AS LABEL, DEPT.* FROM DEPT;
これらのSQL文を実行すると、次のデータが戻されます。
表6-3 サンプルSQL文から戻された非表示列のデータ
LABEL | DEPTNO | DNAME | LOC |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
これに対して、HR_LABEL
列を明示的に指定しない場合は、ラベルはまったく表示されません。ポリシー列名はポリシーに基づいて設定されますが、HIDE
オプションは表単位で設定されることに注意してください。
関連項目
6.4 ラベルを使用したデータのフィルタリング
Oracle Label Securityは、SQL文を処理するとき、作成および適用の手順で、データベースで定義されているセキュリティ・ポリシーを呼び出します。
SELECT
文の場合、ポリシーはユーザーが表示を認可されているデータ行をフィルタします。INSERT
、UPDATE
およびDELETE
文の場合、Oracle Label Securityはユーザーの認証に基づいて要求された操作を許可または拒否します。
- WHERE句での数値ラベル・タグの使用
SELECT
文のWHERE
句で数値ラベル・タグを使用する際には様々な手法があります。 - ラベル付きデータ行の順序付け
SELECT
文のORDER BY
句を使用すると、数値ラベル・タグで行を順序付けることができます。 - ラベルの文字表現による順序付け
LABEL_TO_CHAR
ファンクションは、ラベルの文字表現でデータ行を順序付けます。 - ラベルの上限と下限の決定
Oracle Label Securityには、複数のラベルの最小の上限または最大の下限を決定するファンクションが用意されています。 - MERGE_LABELファンクションを使用したラベルのマージ
MERGE_LABEL
ファンクションは、2つのラベルをマージします。
親トピック: ラベル付きデータの処理
6.4.1 WHERE句での数値ラベル・タグの使用
SELECT
文のWHERE
句で数値ラベル・タグを使用する際には様々な手法があります。
ラベルをNUMBER
形式で使用すると、ラベル・タグのリストで様々なレベルが区別されるようにラベルを設定できます。このような数値ラベル・タグの比較を、ORDER BY
処理や論理演算子とともに使用できます。
たとえば、すべてのUNCLASSIFIED
ラベルを1000番台、すべてのSENSITIVE
ラベルを2000番台、すべてのHIGHLY_SENSITIVE
ラベルを3000番台に割り当てた場合は、すべてのSENSITIVE
レコードをリスト表示できます。
SELECT * FROM emp WHERE hr_label BETWEEN 2000 AND 2999;
すべてのSENSITIVE
レコードとUNCLASSIFIED
レコードをリスト表示するには、次のように入力します。
SELECT * FROM emp WHERE hr_label <3000;
すべてのHIGHLY_SENSITIVE
レコードをリスト表示するには、次のように入力します。
SELECT * FROM emp WHERE hr_label=3000;
ノート:
このような問合せが意味を持つのは、管理者が、最初にラベルに割り当てたラベル・タグに、数値による順序付け方法を適用している場合のみであることに注意してください。この方法により、管理者はデータを簡単に送信できます。ただし、ラベル・タグの値が自動的に生成されると、タグの値とラベルの順序に本質的な関係は存在しません。
または、支配関係を使用して順序付け方法を設定することもできます。
関連項目
親トピック: ラベルを使用したデータのフィルタリング
6.4.2 ラベル付きデータ行の順序付け
SELECT
文のORDER BY
句を使用すると、数値ラベル・タグで行を順序付けることができます。
-
ORDER BY
操作を実行するには、次のようなSELECT
文を使用します。SELECT * from emp ORDER BY hr_label;
この文にはファンクションは不要であることに注意してください。この文は、管理者が設定したラベル・タグを使用できるようにします。
ノート:
この場合も、このような問合せが意味を持つのは、管理者が、最初にラベルに割り当てたラベル・タグに、数値による順序付け方法を適用している場合のみです。
親トピック: ラベルを使用したデータのフィルタリング
6.4.3 ラベルの文字表現による順序付け
LABEL_TO_CHAR
ファンクションは、ラベルの文字表現でデータ行を順序付けます。
-
ラベルの文字列表現でデータ行を順序付けるには、次のような文を使用します。これにより、すべての行が、ラベルのテキスト順序でソートされて戻されます。
SELECT * FROM emp ORDER BY label_to_char (hr_label);
親トピック: ラベルを使用したデータのフィルタリング
6.4.4 ラベルの上限と下限の決定
Oracle Label Securityには、複数のラベルの最小の上限または最大の下限を決定するファンクションが用意されています。
2つの単一行ファンクションは、問合せから戻される各行を操作します。結果は行ごとに1つずつ戻されます。
ノート:
複数のラベルを取るすべてのファンクションでは、ラベルはすべて同じポリシーに属している必要があります。
- LEAST_UBOUNDを使用した最小の上限の検索
OLS_LEAST_UBOUND
(OLS_LUBD
)ファンクションは、label1
およびlabel2:
の最小の上限である文字列ラベルを戻します。 - GREATEST_LBOUNDを使用した最大の下限の検索
OLS_GREATEST_LBOUND
(OLS_GLBD
)スタンドアロン・ファンクションは、2つの異なるラベルがある場合、操作に関連付けることができるデータの最下位ラベルを決定します。
親トピック: ラベルを使用したデータのフィルタリング
6.4.4.1 LEAST_UBOUNDを使用した最小の上限の検索
OLS_LEAST_UBOUND
(OLS_LUBD
)ファンクションは、label1
およびlabel2:
の最小の上限である文字列ラベルを戻します。
つまり、両者を支配している1つのラベルを戻します。最小の上限は、最上位レベル、ラベル内の区分の共用部分およびラベル内のグループの共用部分です。
たとえば、HIGHLY_SENSITIVE:ALPHA
およびSENSITIVE:BETA
の最小の上限は、HIGHLY_SENSITIVE:ALPHA,BETA
です。
-
最小の上限を検索するには、次の構文を使用します。
FUNCTION OLS_LEAST_UBOUND ( label1 IN NUMBER, label2 IN NUMBER) RETURN VARCHAR2;
OLS_LEAST_UBOUND
ファンクションが役立つのは、異なるラベルを持つ行を結合する場合です。これは、結合された行の最高水位標ラベルを提供するためです。
次の問合せでは、各従業員のラベルを所属部署のラベルと比較し、EMP表にあるかDEPT表にあるかに関係なく上位のラベルを戻します。
SELECT ename,dept.deptno, OLS_LEAST_UBOUND(emp.hr_label,dept.hr_label) as label FROM emp, dept WHERE emp.deptno=dept.deptno;
この問合せでは次のデータが戻されます。
表6-4 サンプルSQL文LEAST_UBOUNDから戻されたデータ
ENAME | DEPTNO | LABEL |
---|---|---|
|
10 |
L3:M:D10 |
|
30 |
L3:M:D30 |
|
10 |
L3:M:D10 |
|
20 |
L3:M:D20 |
|
30 |
L2:E:D30 |
ノート:
Oracle Database 12cリリース1 (12.1)では、古いOLSファンクションであるLEAST_UBOUND
およびLUBD
は非推奨です。
このリリースではまだ古いファンクションを使用できますが、かわりにOLS_LEAST_UBOUND
およびOLS_LUBD
ファンクションを使用することをお薦めします。新しいファンクション名を使用すると、他のデータベース・コンポーネントと名前が競合する可能性が回避されます。
親トピック: ラベルの上限と下限の決定
6.4.4.2 GREATEST_LBOUNDを使用した最大の下限の検索
OLS_GREATEST_LBOUND
(OLS_GLBD
)スタンドアロン・ファンクションは、2つの異なるラベルがある場合、操作に関連付けることができるデータの最下位ラベルを決定します。
このファンクションは、label1
およびlabel2
の最大の下限である文字列ラベルを返します。最大の下限は、最下位レベルであり、ラベルの区分とラベルのグループの共通部分です。たとえば、HIGHLY_SENSITIVE:ALPHA
およびSENSITIVE
の最大の下限はSENSITIVE
です。
-
最大の下限を検索するには、次の構文を使用します。
FUNCTION OLS_GREATEST_LBOUND ( label1 IN NUMBER, label2 IN NUMBER) RETURN VARCHAR2;
ノート:
Oracle Database 12cリリース1 (12.1)では、古いOLSファンクションであるGREATEST_LBOUND
およびGLBD
は非推奨です。
このリリースではまだ古いファンクションを使用できますが、かわりにOLS_GREATEST_LBOUND
およびOLS_GLBD
ファンクションを使用することをお薦めします。新しいファンクション名を使用すると、他のデータベース・コンポーネントと名前が競合する可能性が回避されます。
親トピック: ラベルの上限と下限の決定
6.4.5 MERGE_LABELファンクションを使用したラベルのマージ
MERGE_LABEL
ファンクションは、2つのラベルをマージします。
このファンクションは、2つのラベルの文字列書式と、マージ形式の3文字の指定を受け入れます。
-
ラベルをマージするには、次の構文を使用します。
FUNCTION merge_label (label1 IN number, label2 IN number, merge_format IN VARCHAR2) RETURN number;
有効なマージ形式を次のように3文字の文字列で指定します。
<highest level or lowest level><union or intersection of compartments><union or intersection of groups>
-
1文字目には、2つのラベルの最上位レベルと最下位レベルのうち、どちらを使用してマージするかを示します。
-
2文字目には、2つのラベルにある区分の共用部分と共通部分のうち、どちらを使用してマージするかを示します。
-
3文字目には、2つのラベルにあるグループの共用部分と共通部分のうち、どちらを使用してマージするかを示します。
表6-5に、MERGE_LABEL
のフォーマット定数の定義を示します。
表6-5 MERGE_LABELのフォーマット定数
フォーマット指定 | データ型 | 定数 | 意味 | フォーマットの使用位置 |
---|---|---|---|---|
|
|
|
最大レベル |
第1(レベル) |
|
|
|
最小レベル |
第1(レベル) |
|
|
|
2つのラベルの共用部分。 |
第2(区分)および第3(グループ) |
|
|
|
2つのラベルの共通部分。 |
第2(区分)および第3(グループ) |
|
|
|
第1のラベルから第2のラベルを削除します。 |
第2(区分)および第3(グループ) |
|
|
|
区分列に指定すると、区分は戻されません。グループ列に指定すると、グループは戻されません。 |
第2(区分)および第3(グループ) |
たとえば、HUI
の場合は、2つのラベルの最上位レベル、区分の共用部分、グループの共通部分を指定したことになります。
MERGE_LABEL
ファンクションが特に役立つのは、開発者がLEAST_UBOUND
ファンクションで意図した結果が得られない場合です。グループを含む2つのラベルにLEAST_UBOUND
ファンクションを使用すると、予期したよりも機密性の低いデータ・ラベルが得られる場合があります。MERGE_LABEL
ファンクションを使用すると、LEAST_UBOUND
ファンクションで得られるグループの共用部分のかわりに、グループの共通部分を計算できます。
たとえば、グループUNITED_STATES
を含むデータ・レコードのラベルと、グループUNITED_KINGDOM
を含む別のデータ・レコードのラベルがあり、LEAST_UBOUND
ファンクションを使用してこの2つのラベルの最小の上限を計算すると、結果として得られるラベルには、UNITED_STATES
またはUNITED_KINGDOM
について認可されているユーザーがアクセスできます。
これに対して、HUI
のフォーマット句とともにMERGE_LABEL
ファンクションを使用すると、結果的に得られるラベルには最上位レベルと区分の共用部分は含まれますが、グループは含まれません。これは、UNITED_STATES
とUNITED_KINGDOM
には共通部分がないためです。
親トピック: ラベルを使用したデータのフィルタリング
6.5 ラベル付きデータの挿入
様々な状況で、ラベル付きデータを挿入できます。
- ラベル付きデータの挿入について
Oracle Label Securityポリシーで保護されている表にデータを挿入する場合、数値ラベル値タグを指定する必要があります。 - CHAR_TO_LABELを使用したラベルの挿入
行ラベルを挿入するには、ラベル文字列を指定してから、CHAR_TO_LABEL
ファンクションを使用してラベルに変換できます。 - 数値のラベル・タグ値を使用したラベルの挿入
CHAR_TO_LABEL
ファンクションを使用するのではなく、ラベルの数値ラベル・タグ値を使用して、データを挿入できます。 - ラベルを指定しないデータの挿入
INSERT
文でラベルを指定する必要がない状況が2つあります。 - ポリシー・ラベル列が非表示になっている場合のデータの挿入
ラベル列が非表示の場合、その列の存在はデータの挿入に対して透過的です。 - TO_DATA_LABELを使用したラベルの挿入
TO_DATA_LABEL
ファンクションでは、新規のラベルを動的に生成できます。
親トピック: ラベル付きデータの処理
6.5.1 ラベル付きデータの挿入について
Oracle Label Securityポリシーで保護されている表にデータを挿入する場合、数値ラベル値タグを指定する必要があります。
通常、この値はINSERT
文そのものに挿入できます。
そのためには、必要なラベルのタグを明示的に指定するか、ラベルの文字列表現を適切なタグに明示的に変換する必要があります。これは新規ラベル・タグの生成を意味するのではなく、適切なラベル・タグの参照を意味することに注意してください。Oracle Label SecurityでOracle Internet Directoryを使用している場合、許可されるラベル(および対応するタグ)は、管理者により事前定義済でOracle Internet Directoryに存在するラベルのみです。
INSERT
文でラベル値を省略できるのは、次のいずれかの場合のみです。
-
ポリシーの適用時に
LABEL_DEFAULT
強制オプションが指定されている場合 -
ポリシーの適用時に強制オプションが指定されておらず、ポリシーの作成時に
LABEL_DEFAULT
が指定されている場合 -
ポリシー適用文でラベル付けファンクションが指定されている場合
最初の2つの場合は、ユーザーのセッションのデフォルト行ラベルが、挿入される行のラベルとして使用されます。3つ目の場合、挿入される行のラベルは、そのラベル付けファンクションにより作成されます。
親トピック: ラベル付きデータの挿入
6.5.2 CHAR_TO_LABELを使用したラベルの挿入
行ラベルを挿入するには、ラベル文字列を指定してから、CHAR_TO_LABEL
ファンクションを使用してラベルに変換できます。
CHAR_TO_LABEL
ファンクションは、有効なデータ・ラベルを自動的に作成します。
-
ラベルを挿入するには、
INSERT INTO
文を使用します。
次の例に、表emp
の定義を使用して、明示的なラベルでデータを挿入する方法を示します。
INSERT INTO emp (ename,empno,hr_label) VALUES ('ESTANTON',10,char_to_label ('HR', 'SENSITIVE'));
親トピック: ラベル付きデータの挿入
6.5.3 数値のラベル・タグ値を使用したラベルの挿入
CHAR_TO_LABEL
ファンクションを使用するのではなく、ラベルの数値ラベル・タグ値を使用して、データを挿入できます。
-
数値のラベル・タグ値を使用してラベルを挿入するには、
INSERT INTO
文を使用します。
たとえば、SENSITIVE
の数値ラベル・タグが3000の場合、次のようになります。
INSERT INTO emp (ename, empno, hr_label) VALUES ('ESTANTON', 10, 3000);
親トピック: ラベル付きデータの挿入
6.5.4 ラベルを指定しないデータの挿入
INSERT
文でラベルを指定する必要がない状況が2つあります。
LABEL_DEFAULT
が設定されている場合、または表に適用されているラベル付けファンクションがある場合は、INSERT
文でラベルを指定する必要はありません。ラベルは自動的に提供されます。
-
ラベルを指定せずにデータを挿入するには、
INSERT INTO
文を使用します。
たとえば:
INSERT INTO emp (ename, empno) VALUES ('ESTANTON', 10);
結果として得られる行ラベルは、デフォルト値に従って(またはラベル付けファンクションにより)設定されます。
親トピック: ラベル付きデータの挿入
6.5.5 ポリシーのラベル列が非表示になっている場合のデータの挿入
ラベル列が非表示の場合、その列の存在はデータの挿入に対して透過的です。
表の列を明示的にリスト表示せず、ラベル列の値を含めないINSERT
文を記述できます。
データのラベル付けには、セッションの行ラベルまたはラベル付けファンクション(表またはスキーマに対するポリシーの適用時に指定した場合)が使用されます。
列名を明示的に指定しなくても、表の非表示でない各列の値を指定すれば、表に挿入できます。次の例では、working-with-labeled-data.html#GUID-62D8E07A-EC69-4EF7-A0B4-5FC69B476152__BEIIGDEDで説明されている表に行を挿入する方法を示します。
-
ポリシーのラベル列が非表示になっている場合にデータを挿入するには、次の構文を使用します。
INSERT INTO emp VALUES ('196','ESTANTON',Technician,RSTOUT,50000,10);
ラベルは、次のいずれかになります。
-
指定したラベル
-
適用されているポリシーの
LABEL_DEFAULT
オプションで設定されるラベル -
適用されているポリシーで指定されたラベル付けファンクションにより作成されるラベル
ノート:
ポリシー・ラベル列が非表示でない場合は、
INSERT
文にラベル値(場合によっては、コンマで示されるnull)を明示的に含める必要があります。
親トピック: ラベル付きデータの挿入
6.5.6 TO_DATA_LABELを使用したラベルの挿入
TO_DATA_LABEL
ファンクションでは、新規のラベルを動的に生成できます。
このアプローチを使用すると、データ・ラベルが有効であることを保証できます。ただし、Oracle Label SecurityがOracle Internet Directoryで動作するようにインストールされている場合、ラベルはOracle Internet Directoryでolsadmintool
コマンドを使用して集中管理されるため、動的ラベル生成は許可されません。したがって、Oracle Label SecurityがOracle Internet Directory対応の場合、このTO_DATA_LABEL
ファンクションは使用できず、使用するとエラー・メッセージが生成されます。
-
TO_DATA_LABEL
ファンクションに対するEXECUTE
権限があることを確認します。 -
必要に応じて(
INSERT INTO
文などで)TO_DATA_LABEL
を使用します。
たとえば:
INSERT INTO emp (ename, empno, hr_label) VALUES ('ESTANTON', 10, to_data_label ('HR', 'SENSITIVE'));
ノート:
TO_DATA_LABEL
ファンクションを使用するには、個別に明示的に付与する必要があります。また、その使用は厳密に制御する必要があります。