※ 本記事は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

実際の設定方法は次回のエントリで説明します。