5.4 SYS_CONTEXT属性を使用するポリシー式

アプリケーションによって移入されるSYS_CONTEXT属性に依存するポリシー式を記述するときは、注意してください。

ユーザーが(アプリケーションを通じてではなく)なんらかの方法で直接接続した場合、SYS_CONTEXT属性は移入されません。ポリシー式でこのNULLシナリオを処理しないと、意図せずに実際のデータを問合せユーザーに開示してしまうことがあります。

たとえば、クライアント識別子の値がSUPERVISORであるユーザー以外のすべてのユーザーに問合せ結果をリダクションする目的でポリシー式を作成するとします。次の式では、CLIENT_IDENTIFIERの値がNULLである問合せユーザーに、意図せずに実際のデータが表示されます。

SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') IS NOT 'SUPERVISOR'

ポリシー式をより厳密にすると、クライアント識別子が設定されていない場合(NULL値である場合)、問合せ結果はリダクションされます。

SYS_CONTEXT('USERENV', 'CLIENT_IDENTIFIER') IS NOT 'SUPERVISOR' OR IS NULL

SQLでは、NULLとの比較は未定義であるため、FALSEになりますが、リダクションはポリシー式がTRUEに評価された場合にのみ実行されることに注意してください。