読者です 読者をやめる 読者になる 読者になる

素朴な疑問

OSS/Linux

軽く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の人はこれをどうハンドリングしているんだろう。手元に実行環境がないので試すことはできないが、素直にマニュアルを読んだ感じ、後者の実行結果になりそうな気がする。
誰か知らないかなぁ〜

なお、「素朴」な疑問ではないというツッコミは却下します。