※ 本記事は2017年3月2日に公開されたものです。
データベースへのアクセス制御は、システム権限、オブジェクト権限やそれをまとめたロールを利用しておこなうことを以前のエントリで説明しました。これらの権限で実施できるアクセス制御の最小の単位は「表」です。ひとつの表のなかのどのデータにアクセスできるかは権限では制限できません。
Oracle DatabaseのEnterprise Editionでは、より詳細な表の行や列単位でのアクセス制御をおこなうために、仮想プライベートデータベース(VPD:Virtual Private Database)というソリューションを提供しています。仮想プライベートデータベースを利用することで、たとえばひとつの表に複数のユーザーのデータがまとめて入っているような場合でも、それぞれのユーザーが表に全件検索を実施した時に自分のデータしか結果としてもどらないようなアクセス制御を実現できます。人や時間、クライアント端末、アプリなどのアクセス条件によって、同じ表に同じSQL文を発行した場合でも、異なる結果を戻すことができます。
仮想プライベートデータベースはファイングレインアクセスコントロール(Fine-Grained Access Control)という機能を利用して実現されています。ファイングレインアクセスコントロールは、SQLの実行時に内部的に自動的にWHERE句の絞り込み条件を追加する機能です。ファイングレインアクセスコントロールで内部的に自動的にWHERE句が付け加えられることにより、全件検索のSQL文を実行しても、事前に定義された絞り込み条件に合致するデータのみが結果として戻ります。

たとえば、以下の例ではSATOというデータベースユーザーとITOというデータベースユーザーで接続して、同じAPP1スキーマのTESTTAB表に全件検索を実施していますが、ユーザーごとに結果が変わっているのが分かります。これは内部的にWHERE句が付け加えられて、絞り込みが実施されたためです。
SQL> connect sato@appdb パスワードを入力してください: 接続されました。 SQL> select * from app1.testtab; NAME ---------------- SATO SQL> connect ito@appdb パスワードを入力してください: 接続されました。 SQL> select * from app1.testtab; NAME ---------------- ITO
実際の設定方法は次回のエントリで説明します。
