ヘッダーをスキップ
Oracle® OLAP DMLリファレンス
11gリリース2 (11.2)
B61346-03
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次
索引へ移動
索引

前
 
次
 

PERMIT

PERMITコマンドを使用すると、ワークスペース・オブジェクト、およびディメンションやディメンション化されたオブジェクトの特定の値について、読取り専用アクセス権および読取り/書込みアクセス権を付与または拒否できます。さらにPERMITによって、ディメンションのメンテナンス権限の付与または拒否、ワークスペース・オブジェクトに対する権限の変更が可能です。

通常、あるディメンションに対して設定したアクセス権は、そのディメンションのみでなく、そのディメンションによってディメンション化されるオブジェクトに対しても適用されます(「ディメンション権限と他のオブジェクトに対する権限の相互作用」を参照)。他のオブジェクトに対して設定したアクセス権は、その特定のオブジェクトについてのみ適用されます。権限の変更がどの時点で有効になるかは、様々な条件に応じて決まります(「権限の変更が有効となるケース」を参照)。


ヒント:

PERMITコマンドは、直近に定義または検討されたオブジェクトに対して権限を割り当てます。オブジェクトの定義が現行の定義と異なる場合、そのオブジェクトに対して最初にCONSIDER文を使用してからPERMITコマンドを発行します。

構文

PERMIT {READ|WRITE|MNT|PERMIT} [WHEN permission-condition...]

パラメータ

READ

権限条件に応じて、オブジェクトのすべての値を読み取る権限、またはディメンションやディメンション化されたオブジェクトの特定の値のみを読み取る権限を付与または制限します。

ディメンションに対する読取り権限を制限すると、そのディメンションに対するメンテナンス権限も制限されるので注意してください。また、オブジェクトの読取り権限を付与すると、明示的なPERMIT WRITE文で書込み権限を拒否しないかぎり、読取り可能な値に対する書込み権限も許可されます。

WRITE

権限条件に応じて、オブジェクトの任意の値を変更する権限、またはディメンション化されたオブジェクトの特定の値のみを変更する権限を付与または制限します。

オブジェクトに対する書込み権限を制限しても、そのオブジェクトが完全に利用できないというわけではありません。たとえば、計算仕様(aggmapオブジェクト、プログラム、モデル、計算式など)に対する書込み権限を制限した場合、その計算仕様の内容は編集できなくなりますが、そのオブジェクトを実行することは可能です。

Oracle OLAPでは、ディメンション化されたオブジェクト内の読み取りできない値に対する書込み権限を付与することに制約はありません。ディメンション化されたオブジェクトに対するPERMIT READ文とPERMIT WRITE文の両方があり、書込みの権限条件を満たす値のいくつかが読取りの権限条件を満たす値のサブセットに含まれない場合、これらの値は変更できますが読み取ることはできません。


ヒント:

ディメンションによってディメンション化されたオブジェクトに対する書込みアクセスを許可する場合を除き、ディメンションに対する書込み権限を設定しても意味がありません。ディメンションに値を追加する権限を付与または制限するには、かわりに、そのディメンションに対するPERMIT MNT文を発行します。

MNT

権限条件に応じて、ディメンションをメンテナンスする権限を付与または制限します。

読取り権限を制限したディメンションのメンテナンス権限を付与することはできません。ディメンションの読取り権限が制限されている場合、そのディメンションのメンテナンス権限は自動的に拒否されます。

PERMIT

権限条件に応じて、オブジェクトに対する読取り、書込み、メンテナンスまたは許可権限を変更するためにPERMITコマンドを使用する権限を付与または制限します。

オブジェクトの許可権限を明示的に拒否しないかぎり、そのオブジェクトに対して他にどの権限が設定されていても、そのオブジェクトの許可権限は許可されます。

WHEN permission-condition...

WHEN句を省略してPERMIT READ文、PERMIT WRITE文またはPERMIT MNT文を実行すると、オブジェクトに対して完全な読取り、書込みまたはメンテナンス権限が回復されます。

WHEN句を指定する場合、読取り、書込み、メンテナンスまたは許可権限を付与する条件は、1つ以上のブール式で構成されます。これは、オブジェクトにディメンション性があるかどうかや設定する権限の種類によって、また、読取り権限と書き込み権限の場合はオブジェクトにディメンション性があるかどうかによって決まります。

  • ディメンション性を持たないオブジェクトに適用する許可権限、メンテナンス権限または読取り/書込み権限を指定する場合、またはディメンション化されたオブジェクトのすべての値に読取りまたは書込み権限を適用する場合は、1つの値に評価されるブール式として権限条件を指定します。(ディメンション性のないオブジェクトに対する権限を指定するために、ディメンション化されたブール式を指定したり、許可権限やメンテナンス権限を指定すると、ステータスにある最初の値がPERMITによって使用されます。)


    ヒント:

    PERMIT PERMIT文に対する権限条件としてブール値(たとえばYESまたはNO)を指定するのは避けてください。そのかわりに、権限条件をブール変数、ブール値の結果を返すファンクション、または比較演算子で計算するブール値として指定します。このようにすると、許可権限が拒否された場合、ブール値を設定してPERMITRESET文を実行することにより、この許可権限をリストアできます。オブジェクトをロックしたためにその権限を変更できない場合、該当するワークスペースのワークスペース権限プログラムでオブジェクトの許可権限を指定し、ワークスペースをデタッチしてから再アタッチします。

  • 個々のディメンション値またはディメンション化オブジェクトのスライスに適用する読取り権限または書き込み権限を指定する場合は、関連する各ディメンションに対し権限条件を1つ指定します。この場合、WHEN句には次の構文が含まれ、それぞれのディメンション化された権限条件は、オブジェクトのディメンションによってディメンション化されたブール式で構成されます。

    WHEN dimensioned_permission_condition1
       [BY dimensioned_permission_condition2
    [UNION dimensioned_permission_condition2A]...

    UNION句を使用すると、多次元変数のいくつかの対称サブキューブの結合に効率的にアクセスできます。

    ディメンション化された権限条件を表すブール式に、オブジェクト・ディメンションの他に追加のディメンションが存在する場合、PERMITは、使用するブール値の列を判別するためにステータスにある最初の値を受け取る点に注意してください。ディメンションごとのYES値の共通部分(条件の論理AND)は、権限の適用先オブジェクト内の値のサブセットです。ディメンション化された権限条件では表現できないオブジェクト・ディメンションが存在する場合、これらのディメンション値のすべてがYESであるとみなされます。

使用上の注意

オブジェクトの権限を変更する前の重要な注意事項

オブジェクトの権限を変更するときは、次の重要な注意点を念頭に置いて行ってください。

  • オブジェクトに対するPERMITコマンドを発行するには、そのオブジェクトに対する許可権限を持っている必要があります

  • DBAユーザーをロック・アウトしないでください。DBAユーザーはワークスペース内のすべてのオブジェクトにアクセスできる必要があります。

  • INTEGERディメンションに対してPERMIT文を発行すると、望ましくない動作が生じることがあります。INTEGERデータ型のディメンションには、その番号の位置で識別できる値があります。PERMITは、INTEGERの通常の順序(1、2、3、...)が保持されるようにINTEGERディメンションの番号を付け替えます。INTEGERディメンションに対するデフォルトのアクセス権を変更するためPERMITを使用する必要がある場合は、データ型がINTEGERでないディメンションとして再定義してください。

権限の変更が有効となるケース

PERMIT_READプログラムおよびPERMIT_WRITEプログラム内で権限が評価されるのは、PERMIT文またはPERMITRESET文を明示的に発行してからターゲット・オブジェクトを参照したときのみです。


注意:

PERMITRESETは、アナリティック・ワークスペース権限プログラムの実行直後にAW ATTACHによって自動的に実行されます。PERMITRESETの実行により、ワークスペースはすべての権限が実装されてアタッチされます。

アナリティック・ワークスペースがアタッチされてPERMIT_READプログラムまたはPERMIT_WRITEプログラムが実行されると、PERMIT文で指定した権限変更は次の場合に有効になります。

  • PERMITRESET文が実行された場合。

  • いずれかのオブジェクト(ディメンションを除く)を対象とし、権限条件が単一のブール変数で構成される場合、そのブール変数に対する変更は権限に即座に反映されます。(この場合、PERMITRESETを実行する必要はありません。)

  • その他の状況では、PERMITRESET文を発行しない場合、権限はオブジェクトを次回参照するときに評価されます。


    注意:

    OBJファンクションはこのルールの例外です。OBJではオブジェクトがメモリーにロードされないので、オブジェクトの権限に対して前回のロード時以降に加えられた変更は反映されません。新しい権限基準に基づいた情報がOBJから返されるようにするには、OBJ文の前にLOAD文を実行します。

オブジェクトに対する唯一のPERMIT文がPERMIT WRITE文の場合

オブジェクトに対する唯一のPERMIT文がPERMIT WRITEの場合、そのオブジェクトにはデフォルトで読取り権限が付与されます。デフォルトの読取り権限は、PERMIT WRITE文の権限条件の値とは関係なく付与されます。したがって、単一セルの権限条件を持つPERMIT_WRITEの評価結果がNOであっても、ディメンション化されたオブジェクトのすべての値、またはディメンション化されないオブジェクトに対する読取り専用アクセスは可能です。

オブジェクトに対する唯一のPERMIT文が、ディメンション化された権限条件を持つPERMIT WRITEの場合、この文によって、読取り/書込みアクセスが指定される値、および読取り専用アクセスが指定される値があります。例10-73「変数の権限」を参照してください。

ディメンション権限と他のオブジェクトに対する権限の相互作用

ディメンション化されたすべてのデータは、そのディメンションの読取り権限に影響されます。読取り権限条件を満たすディメンション値によって、ディメンションのデフォルトのステータスが決まります。読取り権限のないディメンション値に対応するディメンション化されたオブジェクトの値にはアクセスできません。

ただし、ディメンションに関連付けられている書込み権限をそのディメンションによってディメンション化された他のオブジェクトに適用するには、そのディメンション化オブジェクトに関連付けられているPERMIT文が1つ以上存在する必要があります。

  • ディメンション化オブジェクトにディメンションの書込み権限を継承させたいが、そのオブジェクト自体の権限は設定したくない場合は(ディメンション権限と相互作用する可能性があるため)、評価結果がYESとなる単一セルの権限条件を指定したPERMIT READを使用します。

  • ディメンション化オブジェクトにディメンションの書込み権限を継承させると同時にそのオブジェクト自体の権限も設定する場合は、ディメンションの権限とオブジェクトの権限がどのように影響し合うかを理解した上でオブジェクトの権限を設定してください。

ディメンション権限と、そのディメンションによってディメンション化された大部分のオブジェクトの権限は、次のように相互作用します。

  • ディメンションのアクセス権が、ディメンションに定義されているすべてのディメンション・サロゲートに適用されます。ディメンション・サロゲートでは、PERMIT文を使用できません。

  • ディメンションと関連付けられている読取り権限または書込み権限が存在するが、そのディメンションによってディメンション化されたオブジェクトに関連付けられている権限の制限はない場合、ディメンション化されたオブジェクトの権限は、ディメンションの権限と同じになります。

  • ディメンションとディメンション化されたオブジェクトの両方に関連付けられている読取り権限が存在する場合、ディメンション内にある読取り権限を持つ値およびオブジェクト内にある読取り権限を持つ値との共通部分を取ることにより、オブジェクト内にある読取り権限を持つ値が決定されます。

  • ディメンションとディメンション化されたオブジェクトの両方に関連付けられている書込み権限が存在する場合、ディメンション内にある読取り権限を持つ値、ディメンション内にある書込み権限を持つ値、およびオブジェクト内にある書込み権限を持つ値の共通部分を取ることにより、オブジェクト内にある書込み権限を持つ値が決定されます。

ただし、リレーションと値セットについてはこれは当てはまりません。リレーションまたは値セットのディメンションに対して制限付きの書込み権限が設定されていても、そのディメンションによってディメンション化されるリレーションおよび値セットには影響しません。

権限の判別

DESCRIBE文を使用してオブジェクトを記述する場合、LDのように、オブジェクトに関連付けられている権限が表示されます。唯一の例外は、オブジェクトの許可権限を拒否される場合です。この場合は、オブジェクトを記述しても権限は表示されません。

スコーピング・ツールとしてのPERMITのLIMITに対するメリット

アプリケーション・プログラム内のスコーピング・ツールとして、PERMITにはLIMITコマンドよりも有利な点がいくつかあります。ブール式に従ってディメンション化されたオブジェクトのスコープを制限するには、LIMITおよびLIMITKEEPという2つのLIMIT文を使用する必要があります。同じ処理を実行するために必要なPERMIT文は1つのみです。さらに、アプリケーションのユーザーはアプリケーション・プログラム内のPERMITコマンドで設定された制限付きスコープを変更できません。アプリケーション・プログラム内のLIMITコマンドによって設定されたスコープは、アプリケーションのユーザーが多くのLIMITコマンドを実行するのみで簡単に変更できます。

権限違反の処理

PERMITERRORオプションを使用すると、PERMITコマンドによって設定された変数への権限に違反した場合のOracle OLAPによる処理方法を制御できます。PERMITERRORのデフォルト値はYESで、権限が拒否されている値にユーザーがアクセスしようとするとOracle OLAPによってエラーが通知されることを意味します。PERMITERRORをNOに設定すると、エラー条件が通知されることなくアクセスが拒否されるため、この設定は、ディメンションを許可される値にあらかじめ制限することなく、部分的な権限を持つディメンション化された変数のレポートを作成する場合に役立ちます。PERMITERRORの設定がNOである場合、読取り権限のない値はレポートにNA値として表示されます。

例10-73 変数の権限

monthproductおよびdistrictによってディメンション化される変数salesに対して、次のレポートに示すように、3つの変数の形式のディメンション化された3つの権限条件があるとします。

MONTH.BOOL<MONTH>  PROD.BOOL<PRODUCT>  DISTRICT.BOOL<DISTRICT>
-----------------  ------------------  -----------------------
Jan95    NO        Tents     YES       Boston     NO
Feb95    YES       Canoes    YES       Atlanta    NO
Mar95    NO        Racquets   NO       Chicago    YES
...      ...       ...        ...      ...        ...

この例で示すYESの値が権限条件に存在するYESの値としてはすべてである場合、次のPERMIT文は、95年2月にシカゴで販売したテントおよびカヌーのsalesデータに対する読取り/書込み権限を付与します。salesに対してPERMIT READ文を指定しなかった場合、Oracle OLAPは他のすべてのsalesの値に対して読取り専用権限を付与します。

PERMIT WRITE WHEN district.bool BY prod.bool BY month.bool

完全な書込み権限にリストアするには、次のPERMIT文を実行します。

PERMIT WRITE

salesに対する制限付き書込み権限が存在しない場合、次のPERMIT文は、95年2月にシカゴで販売したテントとカヌーの販売データに対する読取り/書込み権限を付与し、他の販売データの値をすべて非表示にします。

PERMIT READ WHEN district.bool BY prod.bool BY month.bool

例10-74 ディメンション化された権限条件

productディメンションへのアクセスを制限するには、productによってディメンション化された権限条件が必要です。ただし、権限条件に2番目のディメンション、たとえばauthorityが存在する場合、PERMITは、authorityのステータスにある最初の値に基づいてproductに関するBOOLEAN値を選択します。authorityディメンションの読取り権限を1つの値に制限すると、PERMITは、その値を使用してproductに対する権限条件のBOOLEAN値を判別します。REPORTコマンドによって、その後に出力が生成されます。

DEFINE authority DIMENSION TEXT
MAINTAIN authority ADD OTHER DBA
DEFINE prod_authority VARIABLE BOOLEAN <product authority>
...
" Assign values to the variable
...
REPORT prod_authority
 
              -----------------PROD_AUTHORITY------------------
              --------------------PRODUCT----------------------
AUTHORITY     Tents   Canoes   Racquets   Sportswear   Footwear
---------     -----   ------   --------   ----------   --------
Other            NO       NO        YES          YES        YES
Dba             YES      YES        YES          YES        YES

CONSIDER product
PERMIT READ WHEN prod_authority
PERMITERROR = NO
RPEPORT product
 
PRODUCT
-------------
Racquets
Sportswear
Footwear

CONSIDER authority
PERMIT READ WHEN AUTHORITY EQ 'dba'
PERMITRESET
Report product
 
PRODUCT
-------------
Tents
Canoes
Racquets
Sportswear
Footwear

例10-75 ユーザー定義のブール・ファンクション

次の例のusercheckは、変数thisuserの現行値をユーザーIDのリストと照合するユーザー定義のブール・ファンクションです。thisuserの現行値がリストに存在しない場合、usercheckNOを返します。sales変数に適用される次のPERMIT文は、usercheckの戻り値がNOである場合、salesのすべての値に対する読取り専用権限を付与します。usercheckの戻り値がYESである場合、salesのすべての値に対する読取り/書込み権限を付与します。

PERMIT WRITE WHEN usercheck(thisuser)

price変数に適用される次のPERMIT文は、usercheckの戻り値がYESである場合、priceのすべての値に対する完全な権限を付与します。戻り値がNOである場合、price変数に対するすべての権限を拒否します。

PERMIT READ WHEN usercheck(thisuser)

例10-76 個々のセル

特定の販売数量データ、たとえば、1997年3月のボストンのラケットの販売数量にアクセスできないようにする場合、ブール変数を作成し、これをPERMIT文で次の文に示すように使用します。

DEFINE sales.bool VARIABLE BOOLEAN <month product district>
sales.bool = yes
LIMIT month TO 'Mar97'
LIMIT product TO 'Racquets'
LIMIT district TO 'Boston'
sales.bool = no
CONSIDER sales
PERMIT READ WHEN sales.bool

例10-77 個々のディメンション値

districtディメンションに適用される次のPERMITコマンドは、BostonおよびAtlantaを除くすべてのディメンション値にアクセスできなくします。このコマンドにより、Bostonに関連するすべてのデータに対する読取り/書込み権限が付与され、Atlantaに関連するすべてのデータに対する読取り専用権限が付与されます。また、ファンクションusercheck(例10-75「ユーザー定義のブール・ファンクション」を参照)によって許可されるユーザーIDを持たないユーザーがdistrictの権限を変更できないようにします。

PERMIT READ WHEN district EQ 'Boston' OR district EQ 'Atlanta'
PERMIT WRITE WHEN district EQ 'Boston'
PERMIT PERMIT WHEN usercheck(thisuser)