ビューを活用したデータ管理:権限設定と最新データの自動反映

Oracle Master Bronze

データベースにおける「ビュー」は、既存のテーブルから特定の列や行を選択して保存した「仮想的なテーブル」です。ビューは物理的なデータを保持しておらず、必要に応じて元のテーブルにアクセスし、指定されたデータを取り出します。これにより、簡単に必要な情報を抽出したり、セキュリティを強化したりすることが可能です。


ビューを使う理由

ビューを使う主な理由は以下の通りです:

  1. データの簡略化
    複雑なクエリを簡単にし、ユーザーが必要な情報だけにアクセスできるようにする。
  2. セキュリティ強化
    不要な列や機密データへのアクセスを制限することができる。例えば、従業員の給与情報を一般従業員に公開したくない場合に、給与列を除外したビューを作成することが可能です。
  3. 一貫性
    同じクエリを何度も使う場合、ビューを使えば一度作成すれば何度も再利用できる。
  4. 動的なデータ表示
    ビューは「仮想的なテーブル」であり、元のテーブルのデータが更新されると、ビューに表示されるデータも自動的に更新されます。つまり、ビューのデータは常に最新の状態を反映しています。

ビューの基本構文

ビューは以下のような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

コメント

タイトルとURLをコピーしました