素朴な疑問
軽くOracle Label Security(OLS)のドキュメントに目を通してみたが、一つ腑に落ちない点がある。OLSは内部的に Virtual Private Database (VPD) という技術を使って実装されているらしいのだが、これは行レベルのアクセス制御(フィルタリング)のために、強制的にWHERE句に条件をくっつける。
以下のようなクエリの場合、どうなるのだろうか。
SELECT t1.x, t1.y, t2.z FROM t1 LEFT OUTER JOIN t2 ON t1.x = t2.x; (*) t1, t2の定義は以下の通りとする。 (*) クライアントは行ラベルのアクセス制御によって t2 の x=2, z=0.2 のタプルをアクセスできないとする。 +---------+ +---------+ |TABLE: t1| |TABLE: t2| | x | y | | x | z | +---+-----+ +---+-----+ | 1 |'aaa'| | 1 | 0.1 | | 2 |'bbb'| | 2 | 0.2 | | 3 |'ccc'| | 3 | 0.3 | +---+-----+ +---+-----+
期待される結果としては以下の通りだろう。
t2表にはあたかも2つしかタプルが存在しないようにOUTER JOIN が実行される。SE-PostgreSQLはこのように振る舞う。
+---+-----+-----+ | x | y | z | +---+-----+-----+ | 1 |'aaa'| 0.1 | | 2 |'bbb'| | | 3 |'ccc'| 0.3 | +---+-----+-----+
一方、単純にWHERE句にフィルタリング条件を付与した場合には、以下のように INNER JOIN と同じ結果になる。
+---+-----+-----+ | x | y | z | +---+-----+-----+ | 1 |'aaa'| 0.1 | | 3 |'ccc'| 0.3 | +---+-----+-----+
Oracleの人はこれをどうハンドリングしているんだろう。手元に実行環境がないので試すことはできないが、素直にマニュアルを読んだ感じ、後者の実行結果になりそうな気がする。
誰か知らないかなぁ〜
なお、「素朴」な疑問ではないというツッコミは却下します。