資格道場 › レッスン一覧 › データベース
データベース・8/13・12分

ビューと権限の付与

ゴール

ビュー(名前を付けた導出表)の正体・CREATE VIEW の書き方・条件で行数が変わる仕組みを説明できるようになる。GRANT 文とビューの権限、機密保護と整合性の違いを選択肢で見分けられるようになる。

ビューと GRANT は「誰に・どこまで見せるか」を決める仕組みで、業務システムの権限設計そのものです。午前(科目A)では用語の定義と「機密保護か整合性か」の仕分けが繰り返し問われ、覚えれば確実に取れる問題です。

このレッスンで稽古する(用語チェック・過去問)

結論:ビューは「名前を付けた導出表」

ビューは、実際にデータを持っている表(実表=基底表)に問合せをして得られる表に、名前を付けて保存したものです。保存されるのは「どう取り出すか」という定義(SELECT 文)だけです。データそのものはコピーされません。

たとえるなら、ビューは**ネットショップの「保存した検索条件」**です。「在庫あり・1万円以下」という条件を保存しても商品データは増えず、開くたびに最新の商品一覧がその条件で表示されます。

用語 何か データを持つか 試験での見分け方
実表(基底表) CREATE TABLE で作った、データを実際に格納する表 持つ ビューの「元」になる表
導出表 実表への問合せによって得られた表 持たない(結果として得る) 「実表のコピーを別に保存した表」は誤り
ビュー 導出表に名前を付けて定義したもの 持たない(仮想表) 「名前を付けた導出表」が正解の言い回し

ビューについて正しい性質は次のとおりです。

  • ビューの上に、さらにビューを定義できる
  • 一つの基底表に、ビューをいくつでも定義できる
  • 基底表が先にあり、ビューは後から定義する(逆はない)
基底表(実表)データを実際に格納するCREATE TABLE で作る開くたびに問合せビュー=名前を付けた導出表保存は定義(SELECT 文)だけデータはコピーしないビューの上にも定義できるビュー(2段目)別のビューを元に定義
ビューが持つのは定義(SELECT 文)だけで、開くたびに基底表へ問合せる。ビューの上にさらにビューを定義することもできる。

CREATE VIEW の書き方

ビューは CREATE VIEW ビュー名(列名…) AS SELECT 文 で定義します。AS の後ろに来るのは必ず SELECT です。ビューは「問合せの結果」に名前を付けるものだからです。

CREATE VIEW 売上報告(製品番号, 製品名, 金額)
  AS SELECT 製品.製品番号, 製品.製品名, 売上.納品数 * 製品.単価
     FROM 製品, 売上
     WHERE 製品.製品番号 = 売上.製品番号

空欄補充では、ほかの SQL 文と取り違えさせる選択肢が並びます。SQL 文は役割で3種類に分かれます。

分類 役割 主な文
DDL(データ定義言語) 表やビューの入れ物を作る・消す CREATE TABLE / CREATE VIEW / DROP
DML(データ操作言語) 中身を取り出す・変える SELECT / INSERT / UPDATE / DELETE
DCL(データ制御言語) 権限を与える・取り上げる GRANT / REVOKE

CREATE VIEW の AS の後ろに INSERT や GRANT が入ることはありません。

ビューの行数は元の表に合わせて変わる

ビューはデータを持たないので、基底表を更新すると、ビューの中身も自動で変わります。WHERE の条件を満たす行だけがビューに現れます。

行数の問題は「更新後の値で条件式を計算し直し、各行が条件の内側か外側かを判定する」だけで解けます。手順は下の例題で確認してください。

WHERE 条件を更新後の値で判定し直す更新前更新後行A:内側行B:外側行C:内側行D:外側行A:内側行B:内側に変化行C:内側行D:外側更新条件の内側だけビューに出る行行A・行Cビューに出る行行A・行B・行C
基底表の行を更新すると、更新後の値で WHERE 条件を判定し直し、条件の内側に入った行だけがビューに現れる。

ビューの目的:見せる範囲を絞ってデータを守る

ビューを使う一番の目的は、利用できる範囲を限定して、データを保護・保全することです。行(例:自部署の社員だけ)や列(例:給与列を除く)を絞ったビューだけを使わせれば、元の表の残りの部分は隠せます。

ほかにも、利用者はビューの構造だけ知っていればよく、元の表の構造を知る必要はありません。元の表に列を追加しても、その列を使っていないビューは再定義しなくてよいです。

目的として誤りになる選択肢の型は次のとおりです。

  • 「物理的データ独立性を提供する」…記憶装置上の構造変更の影響を隠すのは内部スキーマの役割で、ビューの目的とは別の話です
  • 「ビューにインデックスを付けて高度な検索をする」…インデックスは通常、実表に付けます
  • 「GROUP BY や DISTINCT を使った処理で単純な更新手段を提供する」…集計したビューは元の行と1対1に対応しないので、通常は更新できません
社員表のうち、ビューで見える範囲社員名部署給与佐藤営業隠す田中開発隠す鈴木営業隠す高橋総務隠す見える:自部署の行 × 給与以外の列隠れる:他部署の行・給与列利用者はビューの構造だけ知ればよい
自部署(営業)の行と給与以外の列だけを見せるビューを使わせると、社員表の残りの部分は利用者から隠れる。

GRANT 文と、ビューの権限

GRANT 文は、利用者に表やビューへの操作権限(問合せ・更新・追加・削除など)を与える SQL 文です。取り上げるときは REVOKE 文を使います。

GRANT SELECT, UPDATE ON 社員 TO 佐藤

ビューの権限は、元の表の権限とは別に管理されます。ビューの SELECT 権限があれば、元の表の SELECT 権限がなくても、そのビューに問合せできます。これができるからこそ「元の表には触らせず、ビューだけ見せる」という保護が成り立ちます。

たとえるなら、ビルの受付窓口です。来客は窓口(ビュー)に用があるので、事務所の奥(元の表)に入る鍵は渡されません。

flowchart LR
  A["社員表(基底表)"] -->|"定義"| B["ビュー:自部署社員(給与列なし)"]
  C["利用者"] -->|"ビューの SELECT 権限だけ"| B
  C -.->|"社員表の権限なし"| A

機密保護と整合性:別の機能を混ぜない

DBMS(データベース管理システム)の機能のうち、機密保護(見てはいけない人に見せない・変えさせない)を実現するのはアクセス権限の管理です。選択肢に並ぶトランザクション管理・参照制約・排他制御は、データの矛盾を防ぐ整合性の機能です。

DBMS の機能 何をするか 分類
アクセス権限の管理(GRANT / REVOKE) 利用者ごとに許す操作を決める 機密保護
トランザクション管理 一連の処理を「全部やる」か「全部やらない」かにまとめる 整合性
参照制約 存在しない相手を参照するデータの登録を防ぐ 整合性
専有ロック(排他制御) 同時更新でデータが壊れるのを防ぐ 整合性

パスワードによる接続制限(認証)や、データの暗号化も機密保護に関わる手段です。ただしこれらは GRANT 文の機能ではありません。「GRANT 文の説明」を問われたら、権限の付与を述べた選択肢を選びます。

選択肢に出る文・機能 実際の役割 GRANT か
GRANT 文 操作権限を付与する ○
CONNECT 文 データベースへ接続する ×
CREATE ASSERTION 文 表をまたぐ整合性の条件(表明)を定義する ×
CREATE TABLE の参照制約 整合性のための制約 ×
パスワード設定 認証で接続を制限する ×
暗号化 中身を読めなくする ×
ビューの作成 見せる行・列を絞る ×(CREATE VIEW)
例題 1

ビュー「収益商品」の行数が減る更新はどれか

“商品” 表のデータが次の状態のとき,〔ビュー定義〕で示すビュー “収益商品” の行数が減少する更新処理はどれか。
商品表:
商品コード品名型式売値仕入値
S001TT2003150,000100,000
S003SS2003200,000170,000
S005RR2003140,00080,000
〔ビュー定義〕 CREATE VIEW 収益商品 AS SELECT * FROM 商品 WHERE 売値 - 仕入値 >= 40000

ア 商品コードが S001 の売値を 130,000 に更新する。
イ 商品コードが S003 の仕入値を 150,000 に更新する。
ウ 商品コードが S005 の売値を 130,000 に更新する。
エ 商品コードが S005 の仕入値を 90,000 に更新する。

出典:平成24年度 秋期 基本情報技術者試験 午前 問29

解き方と答えを見る
  1. 条件を確認する:ビューに入るのは「売値 − 仕入値 ≧ 40,000」の行。
  2. 更新前の各行を計算する:S001 は 150,000 − 100,000 = 50,000(入る)、S003 は 200,000 − 170,000 = 30,000(入らない)、S005 は 140,000 − 80,000 = 60,000(入る)。更新前のビューは 2 行。
  3. ア:S001 の売値を 130,000 にすると 130,000 − 100,000 = 30,000。40,000 未満なのでビューから外れ、1 行に減る。
  4. イ:S003 の仕入値を 150,000 にすると 200,000 − 150,000 = 50,000。40,000 以上なのでビューに入り、3 行に増える。
  5. ウ:S005 の売値を 130,000 にすると 130,000 − 80,000 = 50,000。入ったままで 2 行のまま。
  6. エ:S005 の仕入値を 90,000 にすると 140,000 − 90,000 = 50,000。入ったままで 2 行のまま。

答え:ア(S001 の差額が 30,000 になり、条件から外れて行数が減る)

要点(試験直前に読む)

  • ビュー=名前を付けた導出表。データは持たず、定義(SELECT 文)だけを持つ。
  • ビューの上にビューを定義できる。1 つの基底表に何個でも作れる。基底表が先。
  • CREATE VIEW 名前 AS SELECT …。空欄に入るのは SELECT。
  • ビューの行数は、更新後の値で WHERE の条件を計算し直して判定する。
  • ビューの目的は利用範囲の限定によるデータ保護。ビューの SELECT 権限があれば、元の表の権限は不要。
  • 権限を与えるのは GRANT(取り消しは REVOKE)。DBMS の機能のうち機密保護はアクセス権限の管理。トランザクション管理・参照制約・ロックは整合性の機能。

ひっかけ

  • 「ビューに対してビューは定義できない」「1 つの基底表に 1 つだけ」→ どちらも誤り。制約を付け足す選択肢は疑う。
  • 「導出表=実表の一部をコピーして保存した表」→ 誤り。問合せによって得られた表。
  • 機密保護の手段を問う問題で、トランザクション管理・参照制約・専有ロックが並ぶ → これらは整合性の機能。アクセス権限の管理を選ぶ。
  • GRANT 文の説明で、パスワード(認証)・暗号化・ビュー作成が並ぶ → いずれも機密保護に関わるが GRANT ではない。「操作権限を付与する」を選ぶ。
  • ビューの権限で「元の表の権限も必要」「元の表の権限があればビューも使える」→ 誤り。ビューの SELECT 権限があれば足りる。

用語(15)

ビュー びゅー(view)
基底表への問合せ結果に名前を付けて定義した仮想的な表で、データ自体は持たない。
⚠ 実表のコピーとは違う。コピーはデータを持つが、ビューは開くたびに元の表から作り直される。
導出表 どうしゅつひょう
実表に何らかの問合せをして得られる表で、ビューはその一種。
⚠ 「実表の一部をコピーして別に保存した表」は誤り。保存ではなく問合せの結果。
実表(基底表) じつひょう(きていひょう)
CREATE TABLE で定義され、データを実際に格納している表。
⚠ ビュー(仮想表)と対になる。ビューの元になる側が基底表。
CREATE VIEW くりえいとびゅー
CREATE VIEW ビュー名 AS SELECT 文 の形でビューを定義する DDL の文。
⚠ AS の後ろは必ず SELECT。INSERT や GRANT は入らない。
SELECT 文 せれくとぶん
表から条件に合う行や列を取り出す DML の文。
⚠ ビュー定義の中身になる文。INSERT(行の追加)と取り違えない。
GRANT 文 ぐらんとぶん
利用者に表やビューへの問合せ・更新・追加・削除などの操作権限を与える DCL の文。
⚠ 接続(CONNECT)・認証(パスワード)・暗号化・ビュー作成の説明は GRANT ではない。
REVOKE 文 りぼーくぶん
GRANT で与えた操作権限を取り消す DCL の文。
⚠ GRANT の逆。与えるのが GRANT、取り上げるのが REVOKE。
アクセス権限 あくせすけんげん
利用者ごとに、どの表やビューにどの操作を許すかの設定。
⚠ ビューの権限は元の表の権限と別。ビューの SELECT 権限だけでビューに問合せできる。
機密保護 きみつほご
許されていない人にデータを見せたり変えさせたりしないこと。DBMS の機能ではアクセス権限の管理で実現する。
⚠ 整合性(データの矛盾を防ぐこと)と混同しない。
整合性 せいごうせい
データに矛盾や欠けがない状態を保つこと。トランザクション管理・参照制約・排他制御が担う。
⚠ 機密保護とは別の目的。「機密保護の手段」の問題ではひっかけ側に並ぶ。
DDL Data Definition Language(データ定義言語)
表やビューなどの構造を定義する SQL の分類で、CREATE や DROP が該当する。
⚠ DML は中身の操作、DCL は権限の制御。
DCL Data Control Language(データ制御言語)
権限の付与や取消しを行う SQL の分類で、GRANT と REVOKE が該当する。
⚠ DDL(構造の定義)と取り違えやすい。権限なら DCL。
参照制約 さんしょうせいやく
外部キーが参照先の表に存在する値だけを持つように制限する整合性制約。
⚠ 更新権限を与える仕組みではない。権限は GRANT。
専有ロック せんゆうろっく
更新中のデータに他の処理が読み書きできないようにかける鍵で、排他制御の一つ。
⚠ 同時更新でデータが壊れるのを防ぐ整合性の機能で、機密保護ではない。
物理的データ独立性 ぶつりてきでーたどくりつせい
記憶装置上のデータの格納方法を変えても、アプリケーションプログラムに影響が出ない性質。
⚠ ビューの目的として出たら誤り。ビューの目的は利用範囲の限定によるデータ保護。

このレッスンの過去問

このレッスンで稽古する