データベースにおける「ビュー」は、既存のテーブルから特定の列や行を選択して保存した「仮想的なテーブル」です。ビューは物理的なデータを保持しておらず、必要に応じて元のテーブルにアクセスし、指定されたデータを取り出します。これにより、簡単に必要な情報を抽出したり、セキュリティを強化したりすることが可能です。
ビューを使う理由
ビューを使う主な理由は以下の通りです:
- データの簡略化
複雑なクエリを簡単にし、ユーザーが必要な情報だけにアクセスできるようにする。 - セキュリティ強化
不要な列や機密データへのアクセスを制限することができる。例えば、従業員の給与情報を一般従業員に公開したくない場合に、給与列を除外したビューを作成することが可能です。 - 一貫性
同じクエリを何度も使う場合、ビューを使えば一度作成すれば何度も再利用できる。 - 動的なデータ表示
ビューは「仮想的なテーブル」であり、元のテーブルのデータが更新されると、ビューに表示されるデータも自動的に更新されます。つまり、ビューのデータは常に最新の状態を反映しています。
ビューの基本構文
ビューは以下のようなSQL文で作成されます:CREATE VIEW <ビュー名> AS
SELECT <列1>, <列2>, ...
FROM <テーブル名>
WHERE <絞り込み条件>;
もっと分かりやすく表すと、 「create view <ビュー名> as <view の元となる select 文> ;」 です。
実際の例:scottスキーマを使用してビューを作成
scottスキーマには有名な「EMP」テーブルがあります。このテーブルには従業員の情報が含まれていますが、給与情報(SAL列)は一般の従業員には公開しないという要件を考慮しつつ、他の情報だけを公開するビューを作成してみましょう。
SCOTTスキーマについては以下の記事をご確認ください。
EMPテーブルの構造
まず、EMP
テーブルには次のような列があります:
EMPNO
: 従業員番号ENAME
: 従業員名JOB
: 職種MGR
: マネージャ番号HIREDATE
: 雇用日SAL
: 給与COMM
: コミッションDEPTNO
: 部門番号
ビューの作成例(給与情報を除外)
以下のSQLで、従業員番号(EMPNO
)、従業員名(ENAME
)、職種(JOB
)、雇用日(HIREDATE
)、部門番号(DEPTNO
)を選択し、給与情報を含めないビューを作成します:CREATE VIEW emp_info AS
SELECT EMPNO, ENAME, JOB, HIREDATE, DEPTNO
FROM EMP;
このビューでは、給与(SAL
)列が含まれておらず、一般従業員が閲覧しても問題のない情報だけを提供します。
SQL> @?/rdbms/admin/utlsampl.sql ★SCOTTサンプルスキーマをインストール
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0との接続が切断されました。
[oracle@v19single ~]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on 金 10月 11 16:42:07 2024
Version 19.21.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
最終正常ログイン時間: 金 10月 11 2024 16:41:50 +09:00
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.0.0
に接続されました。
SQL> grant create view to scott; ★SCOTTにCREATE VIEW権限を付与
権限付与が成功しました。
SQL> conn scott/tiger
接続されました。
SQL> CREATE VIEW emp_info AS
2 SELECT EMPNO, ENAME, JOB, HIREDATE, DEPTNO
3 FROM EMP;
ビューが作成されました。
SQL> select * from emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- ------------- ---------- -------- ---------- ---------- ----------
7369 SMITH CLERK 7902 80-12-17 800 20
7499 ALLEN SALESMAN 7698 81-02-20 1600 300 30
7521 WARD SALESMAN 7698 81-02-22 1250 500 30
7566 JONES MANAGER 7839 81-04-02 2975 20
7654 MARTIN SALESMAN 7698 81-09-28 1250 1400 30
7698 BLAKE MANAGER 7839 81-05-01 2850 30
7782 CLARK MANAGER 7839 81-06-09 2450 10
7839 KING PRESIDENT 81-11-17 5000 10
7844 TURNER SALESMAN 7698 81-09-08 1500 0 30
7900 JAMES CLERK 7698 81-12-03 950 30
7902 FORD ANALYST 7566 81-12-03 3000 20
7934 MILLER CLERK 7782 82-01-23 1300 10
12行が選択されました。
SQL> select * from emp_info;
EMPNO ENAME JOB HIREDATE DEPTNO
---------- ---------- ------------- -------- ----------
7369 SMITH CLERK 80-12-17 20
7499 ALLEN SALESMAN 81-02-20 30
7521 WARD SALESMAN 81-02-22 30
7566 JONES MANAGER 81-04-02 20
7654 MARTIN SALESMAN 81-09-28 30
7698 BLAKE MANAGER 81-05-01 30
7782 CLARK MANAGER 81-06-09 10
7839 KING PRESIDENT 81-11-17 10
7844 TURNER SALESMAN 81-09-08 30
7900 JAMES CLERK 81-12-03 30
7902 FORD ANALYST 81-12-03 20
7934 MILLER CLERK 82-01-23 10
12行が選択されました。
★作成したemp_infoビューでは、元のemp表と異なり、sal列等は出力されていない。
(emp_infoビューを作成した際に指定した列のみが表示される。)
ビューの動作
ビューは仮想的なテーブルであるため、元の EMP
テーブルに変更が加わった場合、それが自動的にビューにも反映されます。たとえば、EMP
テーブルに新しい従業員を追加したり、既存の従業員情報を更新したりすれば、その内容はビューでの結果にも即座に反映されます。これにより、ビューを使うユーザーは常に最新のデータを見ることができます。
例えば以下のようにemp_infoビューではなく、元のemp表を更新すると、emp_infoでも更新した値が更新されていることが分かります。
SQL> select * from emp_info where empno=7654;
EMPNO ENAME JOB HIREDATE DEPTNO
---------- ----------- ------------ -------- ----------
7654 MARTIN SALESMAN 81-09-28 30
SQL> update emp set job='MANAGER' where empno=7654; ★元のEMP表を更新
1行が更新されました。
SQL> select * from emp_info where empno=7654; ★EMP_INFOビューにも反映されている
EMPNO ENAME JOB HIREDATE DEPTNO
---------- ---------- ------------- -------- ----------
7654 MARTIN MANAGER ★ 81-09-28 30
また、反対にビュー側でもUPDATE権限等のオブジェクト権限を持っているユーザーであれば、ビューの値を更新することが可能です。
この場合は、ビューの元となった表にも更新が反映されます。
SQL> select empno,ename,job,hiredate,deptno from emp where empno=7654;
EMPNO ENAME JOB HIREDATE DEPTNO
---------- ----------- ------------ -------- ----------
7654 MARTIN SALESMAN 81-09-28 30
SQL> update emp_info set job='MANAGER' where empno=7654; ★ビューの値を更新
1行が更新されました。
SQL> select empno,ename,job,hiredate,deptno from emp where empno=7654; ★元表にも反映されている
EMPNO ENAME JOB HIREDATE DEPTNO
---------- ---------- ------------- -------- ----------
7654 MARTIN MANAGER ★ 81-09-28 30
ビューの利用
作成したビューに対してクエリを実行するのは、通常のテーブルと同じように行います:SELECT * FROM emp_info;
このクエリにより、従業員の情報(従業員番号、名前、職種、雇用日、部門番号)が表示され、給与情報は表示されません。また、EMP
テーブルに変更があれば、このクエリの結果も自動的に最新の状態が反映されます。
一般ユーザーにビューを公開する方法
ビューを作成した後、一般の従業員がそのビューにアクセスできるようにするためには、権限を付与する必要があります。デフォルトでは、ビューを作成したユーザー(所有者)のみがそのビューにアクセスできます。一般の従業員(例えばscott
ユーザー)にビューへのアクセスを許可するためには、以下のように権限を付与します。
権限付与の基本構文
権限を付与するには、GRANT
文を使用します。
たとえば、SELECT
権限を付与する場合の構文は以下の通りです:GRANT SELECT ON <ビュー名> TO <ユーザー名>;
view_name
はアクセスを許可したいビューの名前で、user_name
はアクセスを許可したいユーザー名です。
実際の権限付与例
先ほど作成した emp_info
ビューに対して、一般ユーザー user1 に読み取り権限(SELECT
権限)を付与するには、以下のようにします:GRANT SELECT ON emp_info TO user1;
このSQLを実行することで、user1ユーザーはemp_info
ビューに対してSELECT
権限を持ち、内容を確認できるようになります。
SQL> show user
ユーザーは"USER1"です。
SQL> select * from scott.emp_info; ★オブジェクト権限が無いため見れない
select * from scott.emp_info
*
行1でエラーが発生しました。:
ORA-00942: 表またはビューが存在しません。
SQL> conn scott/tiger
接続されました。
SQL> GRANT SELECT ON emp_info TO user1; ★USER1にオブジェクト権限を付与
権限付与が成功しました。
SQL> conn user1/user1
接続されました。
SQL> select * from scott.emp_info; ★emp_infoビューを見ることができる
EMPNO ENAME JOB HIREDATE DEPTNO
---------- ------------------------------ --------------------------- -------- ----------
7369 SMITH CLERK 80-12-17 20
7499 ALLEN SALESMAN 81-02-20 30
7521 WARD SALESMAN 81-02-22 30
7566 JONES MANAGER 81-04-02 20
7654 MARTIN SALESMAN 81-09-28 30
7698 BLAKE MANAGER 81-05-01 30
7782 CLARK MANAGER 81-06-09 10
7839 KING PRESIDENT 81-11-17 10
7844 TURNER SALESMAN 81-09-08 30
7900 JAMES CLERK 81-12-03 30
7902 FORD ANALYST 81-12-03 20
7934 MILLER CLERK 82-01-23 10
12行が選択されました。
SQL>
他の権限付与:INSERT、UPDATE、DELETE も可能
特定のユーザーに対してビューを参照するだけでなく、データの追加や更新、削除などの操作権限を付与することも可能です。たとえば、データの追加権限(INSERT
)や更新権限(UPDATE
)を付与する場合は次のようにします:
- INSERT権限を付与:
GRANT INSERT ON emp_info TO user2;
- UPDATE権限を付与:
GRANT UPDATE ON emp_info TO user2;
- DELETE権限を付与:
GRANT DELETE ON emp_info TO user2;
これらの権限を付与することで、ユーザーはビューに対してデータの追加や修正、削除を行うことができるようになります。ただし、ビューを通じて行われた操作は、元のテーブルに反映されるため、適切な権限管理が重要です。
権限の確認
付与した権限は以下のクエリで確認できます:SELECT grantee,owner,table_name,grantor,privilege FROM USER_TAB_PRIVS WHERE TABLE_NAME = 'EMP_INFO';
SQL> SELECT grantee,owner,table_name,grantor,privilege FROM DBA_TAB_PRIVS WHERE TABLE_NAME = 'EMP_INFO';
GRANTEE OWNER TABLE_NAME GRANTOR PRIVILEGE
---------- ---------- ---------- ---------- --------------------
USER2 SCOTT EMP_INFO SCOTT DELETE
USER2 SCOTT EMP_INFO SCOTT INSERT
USER1 SCOTT EMP_INFO SCOTT SELECT
USER2 SCOTT EMP_INFO SCOTT UPDATE
まとめ
ビューを使えば、機密情報を保護しつつ必要なデータのみを提供することが可能です。さらに、ビューにアクセスできるユーザーを制御することで、セキュリティを強化できます。特定のユーザーにはデータの参照だけでなく、データの追加(INSERT
)、更新(UPDATE
)、削除(DELETE
)といった操作権限を付与することも可能です。また、ビューは元のテーブルのデータが更新されるたびに自動的に最新の情報が反映されるため、常に最新の状態を保つことができます。権限を適切に設定することで、一般ユーザーにもビューのデータを安全に共有できるようになり、管理者にとっても効率的なシステム管理が可能になります。
[参考]
SQL言語リファレンス – CREATE VIEW
コメント