ビューと権限の付与
ビュー(名前を付けた導出表)の正体・CREATE VIEW の書き方・条件で行数が変わる仕組みを説明できるようになる。GRANT 文とビューの権限、機密保護と整合性の違いを選択肢で見分けられるようになる。
ビューと GRANT は「誰に・どこまで見せるか」を決める仕組みで、業務システムの権限設計そのものです。午前(科目A)では用語の定義と「機密保護か整合性か」の仕分けが繰り返し問われ、覚えれば確実に取れる問題です。
このレッスンで稽古する(用語チェック・過去問)結論:ビューは「名前を付けた導出表」
ビューは、実際にデータを持っている表(実表=基底表)に問合せをして得られる表に、名前を付けて保存したものです。保存されるのは「どう取り出すか」という定義(SELECT 文)だけです。データそのものはコピーされません。
たとえるなら、ビューは**ネットショップの「保存した検索条件」**です。「在庫あり・1万円以下」という条件を保存しても商品データは増えず、開くたびに最新の商品一覧がその条件で表示されます。
| 用語 | 何か | データを持つか | 試験での見分け方 |
|---|---|---|---|
| 実表(基底表) | CREATE TABLE で作った、データを実際に格納する表 | 持つ | ビューの「元」になる表 |
| 導出表 | 実表への問合せによって得られた表 | 持たない(結果として得る) | 「実表のコピーを別に保存した表」は誤り |
| ビュー | 導出表に名前を付けて定義したもの | 持たない(仮想表) | 「名前を付けた導出表」が正解の言い回し |
ビューについて正しい性質は次のとおりです。
- ビューの上に、さらにビューを定義できる
- 一つの基底表に、ビューをいくつでも定義できる
- 基底表が先にあり、ビューは後から定義する(逆はない)
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 の条件を満たす行だけがビューに現れます。
行数の問題は「更新後の値で条件式を計算し直し、各行が条件の内側か外側かを判定する」だけで解けます。手順は下の例題で確認してください。
ビューの目的:見せる範囲を絞ってデータを守る
ビューを使う一番の目的は、利用できる範囲を限定して、データを保護・保全することです。行(例:自部署の社員だけ)や列(例:給与列を除く)を絞ったビューだけを使わせれば、元の表の残りの部分は隠せます。
ほかにも、利用者はビューの構造だけ知っていればよく、元の表の構造を知る必要はありません。元の表に列を追加しても、その列を使っていないビューは再定義しなくてよいです。
目的として誤りになる選択肢の型は次のとおりです。
- 「物理的データ独立性を提供する」…記憶装置上の構造変更の影響を隠すのは内部スキーマの役割で、ビューの目的とは別の話です
- 「ビューにインデックスを付けて高度な検索をする」…インデックスは通常、実表に付けます
- 「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) |
ビュー「収益商品」の行数が減る更新はどれか
| 商品コード | 品名 | 型式 | 売値 | 仕入値 |
|---|---|---|---|---|
| S001 | T | T2003 | 150,000 | 100,000 |
| S003 | S | S2003 | 200,000 | 170,000 |
| S005 | R | R2003 | 140,000 | 80,000 |
ア 商品コードが S001 の売値を 130,000 に更新する。
イ 商品コードが S003 の仕入値を 150,000 に更新する。
ウ 商品コードが S005 の売値を 130,000 に更新する。
エ 商品コードが S005 の仕入値を 90,000 に更新する。
解き方と答えを見る
- 条件を確認する:ビューに入るのは「売値 − 仕入値 ≧ 40,000」の行。
- 更新前の各行を計算する:S001 は 150,000 − 100,000 = 50,000(入る)、S003 は 200,000 − 170,000 = 30,000(入らない)、S005 は 140,000 − 80,000 = 60,000(入る)。更新前のビューは 2 行。
- ア:S001 の売値を 130,000 にすると 130,000 − 100,000 = 30,000。40,000 未満なのでビューから外れ、1 行に減る。
- イ:S003 の仕入値を 150,000 にすると 200,000 − 150,000 = 50,000。40,000 以上なのでビューに入り、3 行に増える。
- ウ:S005 の売値を 130,000 にすると 130,000 − 80,000 = 50,000。入ったままで 2 行のまま。
- エ: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)
基底表への問合せ結果に名前を付けて定義した仮想的な表で、データ自体は持たない。
⚠ 実表のコピーとは違う。コピーはデータを持つが、ビューは開くたびに元の表から作り直される。
実表に何らかの問合せをして得られる表で、ビューはその一種。
⚠ 「実表の一部をコピーして別に保存した表」は誤り。保存ではなく問合せの結果。
CREATE TABLE で定義され、データを実際に格納している表。
⚠ ビュー(仮想表)と対になる。ビューの元になる側が基底表。
CREATE VIEW ビュー名 AS SELECT 文 の形でビューを定義する DDL の文。
⚠ AS の後ろは必ず SELECT。INSERT や GRANT は入らない。
表から条件に合う行や列を取り出す DML の文。
⚠ ビュー定義の中身になる文。INSERT(行の追加)と取り違えない。
利用者に表やビューへの問合せ・更新・追加・削除などの操作権限を与える DCL の文。
⚠ 接続(CONNECT)・認証(パスワード)・暗号化・ビュー作成の説明は GRANT ではない。
GRANT で与えた操作権限を取り消す DCL の文。
⚠ GRANT の逆。与えるのが GRANT、取り上げるのが REVOKE。
利用者ごとに、どの表やビューにどの操作を許すかの設定。
⚠ ビューの権限は元の表の権限と別。ビューの SELECT 権限だけでビューに問合せできる。
許されていない人にデータを見せたり変えさせたりしないこと。DBMS の機能ではアクセス権限の管理で実現する。
⚠ 整合性(データの矛盾を防ぐこと)と混同しない。
データに矛盾や欠けがない状態を保つこと。トランザクション管理・参照制約・排他制御が担う。
⚠ 機密保護とは別の目的。「機密保護の手段」の問題ではひっかけ側に並ぶ。
表やビューなどの構造を定義する SQL の分類で、CREATE や DROP が該当する。
⚠ DML は中身の操作、DCL は権限の制御。
権限の付与や取消しを行う SQL の分類で、GRANT と REVOKE が該当する。
⚠ DDL(構造の定義)と取り違えやすい。権限なら DCL。
外部キーが参照先の表に存在する値だけを持つように制限する整合性制約。
⚠ 更新権限を与える仕組みではない。権限は GRANT。
更新中のデータに他の処理が読み書きできないようにかける鍵で、排他制御の一つ。
⚠ 同時更新でデータが壊れるのを防ぐ整合性の機能で、機密保護ではない。
記憶装置上のデータの格納方法を変えても、アプリケーションプログラムに影響が出ない性質。
⚠ ビューの目的として出たら誤り。ビューの目的は利用範囲の限定によるデータ保護。
このレッスンの過去問
- ビューの定義(導出表)平成24年度 春期 基本情報技術者試験 午前 問29
- ビュー定義の条件による行数変化の判定平成24年度 秋期 基本情報技術者試験 午前 問29
- ビューの目的(利用範囲限定によるデータ保護)基本情報技術者試験 科目A免除 修了試験 20241208 実施分 問21
- ビューの権限独立性(ベース表権限との分離)基本情報技術者試験 科目A免除 修了試験 20250727 実施分 問21
- SQLのGRANT文(権限付与)平成30年度 春期 基本情報技術者試験 午前 問27