ホーム > データベーススペシャリスト試験 > 2016年
データベーススペシャリスト試験 2016年 午後1 問03
RDBMS のセキュリティに関する次の記述を読んで、 設問1〜3に答えよ。
B社は,個人顧客を対象にした保険会社である。 B社では,顧客の個人情報の保護を強化するために, 営業支援システムにおけるセキュリティに関する設計を見直すことにした。 情報システム部のFさんがその見直しを担当した。
〔RDBMSのビュー及びセキュリティに関する主な仕様〕
(1) 実テーブル (以下, テーブルという) 又はビューのアクセス権限 (SELECT, INSERT, UPDATE 及び DELETE の各権限) をもつユーザは,テーブル又はビューにアクセスすることができる。
(2) ビューにアクセスする場合,そのビューが参照するテーブル又は別のビューのアクセス権限は不要である。
(3) テーブル又はビューのアクセス権限は,ユーザID, ロールに付与される。
(4) ロールは,ユーザID に付与され, 別のロールにも付与されることがある。
〔営業部の組織 業務の概要〕
営業部の組織・ 業務の概要は次のとおりである。 組織の一部を図1に示す。
(1) 営業部及び営業課は, 部門番号で識別される。
(2) 社員は,社員番号で識別される。 社員には,営業支援システムにログインするためのユーザID (社員番号を使用) が付与されている。
(3) 個人顧客(以下,顧客という)は, 顧客番号で識別される。 1人の顧客は,つの営業課によって担当される。
(4) 課長は、部下社員から成る少人数の営業チーム (以下, チームという)を複数編成する。経験豊かな社員については, 複数チームに参加させることがある。
(5) チームは,顧客を訪問して面談し、 保険に関わる様々な業務を行う。
(6) 各チームは,複数顧客を担当する。 同じ顧客を複数チームが担当することはない。
(7) 課長は,随時, チーム編成を変える。 チームに編成される社員が変わったり, チームから離れた社員が,また同じチームに戻ったりすることがある。なお,チーム編成は,営業支援システムによって管理されていない。

〔営業支援システムの概要〕
1.主なテーブルの構造
営業支援システムで使用される主なテーブルの構造を図2に示す。

2.セキュリティ要件
B社での顧客の個人情報(以下、個人情報という)とは、顧客名,生年月日,その他の記述などによって特定の個人を識別することができるものをいう。 セキュリティに関する設計見直し後の個人情報に関するセキュリティ要件は,次の①〜④のとおりである。
① 営業課の社員は, その課が担当する顧客の個人情報にアクセスできる。
② 部門長は、部下がアクセスできる全ての情報にアクセスできる。
③ 個人情報が格納されているテーブルを隠蔽するために, 社員にはビューを使わせ、テーブルには直接アクセスさせない。
④ 個人情報にアクセスする必要がなくなった社員については,そのことを反映するためのアクセス制限を直ちに実施する。
3.操作及び処理の概要
社員が自分のユーザID を指定してログインした営業支援システムに対する操作,及び営業支援システムによる処理の概要は,次のとおりである。
(1) 社員は,顧客訪問の前に予定を登録し, 予定の変更は,その都度,反映する。予定なしに顧客訪問することはない。
(2) 社員は,予定日に顧客訪問を実施後,その実績を登録する。
(3) 社員は,画面上でアクセスを許可されたテーブル名又はビュー名の一覧から一つを選び,選択・集計条件及び結果行の並び順を指定する。
(4) 営業支援システムは, (3) の指定に基づき, 実行可能なSQL文を動的に組み立てて実行し, その実行結果を画面に出力する。
〔ビュー及びロールの設計〕
Fさんは、個人情報を含む営業課別ビューのうち、営業1課及び営業2課のビューを、表1のSQL1 及び SQL2 に示すように設計した。

Fさんは,ビューを用いることを前提に,次のようにロールを設計し、 運用することに決めた。営業課別ビューのアクセス権限をロールに付与する手順を,表2に示す。
(1) 部門番号をロール名として,ロールを定義する。
(2) 営業課別ビューのアクセス権限をロールに付与する。
(3) ロールの付与・剥奪については,課長が 1営業日前までにデータベース管理者(以下,DBA という)に依頼する。 DBA は、 課長からの依頼に基づいて,ロールの付与・剥奪を RDBMSに対して実施する。

〔ビューの設計変更〕
Fさんが, 設計見直し前の営業支援システムの利用状況を分析したところ, 動的に組み立てて実行された SQL 文の中に, “顧客” テーブルに直接アクセスする SQL 文,及び複雑でかつ実行回数が多い SQL 文があった。 前者の例を照会に,後者の例を照会2に示す。
照会1 社員が過去に登録した訪問予定のうち, その社員が予定日に訪問しなかった顧客の顧客番号, 顧客名, 社員番号及び訪問予定日を出力する (表3の SQL3 を参照)。
照会2 年初からの訪問回数がN回以上の社員について, 社員番号, 社員名,訪問回数を出力する。 ここで, N は実行時に与えられ, SQL 文の動的パラメタの? に設定される (表3のSQL4 を参照)。
Fさんは,照会1についてはセキュリティ要件③を満たすために,照会2については SQL文を簡単にするために, それぞれビューを使うことにした。

〔セキュリティ要件の強化〕
営業支援システムのセキュリティを更に強化するために, セキュリティ要件①が,“チームの社員は,当該チームが担当する顧客の個人情報にアクセスできる。” に変更された。 F さんは、営業課別のロールをチーム別のロールに変更するという対応(対応案A) も考えたが,次のような対応 (対応案 B) を採用することにした。
(1) 営業支援システムに, 新たに “チームメンバ” テーブルを追加する。 当該テーブルへのアクセス権限 (DELETE 権限以外) を課長に与え, 課長が次のような操作を行える機能を追加する。 ただし, 操作は各営業課内に限られるものとする。
(a) 営業課内で一意なチーム番号を付与する。
(b) 営業課内のチームの社員ごとに, 担当開始日及び担当終了日を設定した行を登録する。 担当終了日が未定の場合は, NULL を設定する。
(c) 担当開始日の当日又は前日までに,行を登録する。
(d) 担当開始日列又は担当終了日列を、いつでも変更することができる。
(e) 過去にどの社員がどのチームのメンバだったかを調べることができる。
(2) “顧客” テーブルにチーム番号列を追加し,営業課別だった表1のSQL1及びSQL2 を,営業課共通にするために, 表4の SQL6のように変更する。

設問1(1):〔ビュー及びロールの設計〕 について,(1),(2)に答えよ。
表2中の(a)〜(c)に入れる適切な字句を答えよ。
模範解答
a:B11
b:B12
c:B10
解説
キーワード・論点整理
- 「(3) テーブル又はビューのアクセス権限は,ユーザID, ロールに付与される。」
- 「(4) ロールは,ユーザID に付与され, 別のロールにも付与されることがある。」
- セキュリティ要件②:「部門長は、部下がアクセスできる全ての情報にアクセスできる。」
- ロール階層を使って,「営業部ロール(B10)」→「営業1課ロール(B11)」「営業2課ロール(B12)」という親子関係を構築
解答がこのようになる理由
表2の該当箇所をまとめると、以下のとおりです。
これを埋めるには、
- 営業1課ビューへのアクセス権限を持つロールは「B11」
- 営業2課ビューへのアクセス権限を持つロールは「B12」
- 部門長(L氏)は「部下がアクセスできる全ての情報にアクセスできる」ため、
自分のユーザID(E111)に直接 B11,B12 を付与するのではなく、
「営業部ロール(B10)」に対して B11,B12 を付与し、
L氏には既に付与している B10 を通じて間接的に権限を得る
という設計をします。
したがって、
したがって、
- a = B11
- b = B12
- c = B10
の組み合わせで、
GRANT ROLE B11, B12 TO B10;
GRANT SELECT ON 営業1課ビュー TO B11;
GRANT SELECT ON 営業2課ビュー TO B12;
という一連の権限付与を行うことで、
「営業部ロール(B10)」を持つ部門長が課ロールを通じて全ての顧客個人情報ビューにアクセスできるようになります。
「営業部ロール(B10)」を持つ部門長が課ロールを通じて全ての顧客個人情報ビューにアクセスできるようになります。
受験者が誤りやすいポイント
- ユーザID への直接付与 vs ロールへの付与
セキュリティ要件②から,部門長(E111)へ直接 B11,B12 を付与しても要件は満たせますが,
「ロールは別のロールにも付与される」という仕様(4)を活かすことで管理性を高めています。 - SQL アの対象(c)を E111 と誤認しない
「GRANT ROLE … TO <ユーザID>」と思い込みやすいですが,文脈上「ロールに他のロールを付与」する操作です。
試験対策として覚えておくべきポイント
- ロール階層の活用
ロールにロールを付与すると,下位ロールの権限をまとめて上位ロールに持たせられる。 - GRANT ROLE の構文
- ユーザIDにも,ロールにも付与可能
- 付与先が「ユーザID」の場合も「ロール」の場合も同じ構文
- セキュリティ要件から設計を読み取る
「部門長は部下と同じ権限を持つ」とある場合,ロール階層を用いることで運用負荷を下げる工夫が必要 - 問題文の仕様(1)~(4)を正確に引用し,意図を把握する訓練
問題文中の「ロールは別のロールにも付与される」などの一文は,解答の鍵になります。
設問1(2):〔ビュー及びロールの設計〕 について,(1),(2)に答えよ。
表2のア〜ケで示した SQL文を正しい順に並べ替えよ。なお,正しい順は複数通りあるが,そのうちの一つを答えよ。
( )→( )→( )→( )→( )→( )→( )→( ク )→( ケ )
注記 オ,カ,キは順不同,及び,イ,ウ,エ,アは順不同
模範解答
(オ) → (カ) → (キ) → (イ) → (ウ) → (エ) → (ア) → (ク) → (ケ)
解説
キーワードと論点整理
今回の設問は,「ロールの定義」「ロールの付与」「ビューへの権限付与」を,RDBMS 上で SQL 文を正しい手順で実行する手順を問うものです。
表2 に示された各 SQL 文と対応関係を整理すると,以下のようになります。
表2 に示された各 SQL 文と対応関係を整理すると,以下のようになります。
※(ア)中の
<u>a</u> <u>b</u> <u>c</u>
にはそれぞれ B11
B12
E111
が入ります(部門長が2つの課ロールを所有するため)。解答がこの順序になる理由
-
ロールの定義は最初
RDBMS の仕様より,「ロールは,ユーザID に付与され,別のロールにも付与されることがある」 (仕様(4)) ため,まずロール自体を作成しておかないと,後続の GRANT 文がエラーになります。
→ (オ) → (カ) → (キ) -
ユーザへのロール付与
次に,「ロールは,ユーザID に付与」(仕様(4)) することで,社員がそのロールに紐づく権限を獲得します。- 課長や部下社員に,それぞれ属するロール(B10, B11, B12)を付与
→ (イ) → (ウ) → (エ) - 続いて「部門長は,部下がアクセスできる全ての情報にアクセスできる」 (セキュリティ要件②) を実現するために,部門長 E111 に部下課のロールを追加付与します。
→ (ア)
- 課長や部下社員に,それぞれ属するロール(B10, B11, B12)を付与
-
ビューへの SELECT 権限付与
セキュリティ要件③「社員にはビューを使わせ,テーブルには直接アクセスさせない」に基づき,各ロールに対して対応するビューの SELECT 権限を付与します。
→ (ク) → (ケ)
――――
以上より,SQL 文を実行する正しい順序は
以上より,SQL 文を実行する正しい順序は
(オ) → (カ) → (キ) → (イ) → (ウ) → (エ) → (ア) → (ク) → (ケ)
となります。
※注記:オ, カ, キ の順序は入れ替えてもよく,同様に イ, ウ, エ, ア の順序もロール付与のグループ内では等価です。
※注記:オ, カ, キ の順序は入れ替えてもよく,同様に イ, ウ, エ, ア の順序もロール付与のグループ内では等価です。
受験者が誤りやすいポイント
-
ロール作成順を後回しにする
「GRANT ROLE … TO …」を先に書いてしまうと,対象のロールが未定義でエラーになります。 -
ビュー権限付与とロール付与の順序混同
ビューへのGRANT SELECT
は「ロールに対して」付与するので,ロール自体を作成し,さらにユーザにロールを与えたあとに行うのが自然です。 -
部門長へのロール付与漏れ
部門長が下位ロールを持たないと,“部下がアクセスできる情報”をすべて参照できず,セキュリティ要件②を満たせません。
試験対策として覚えておくべきポイント
-
ロールと権限付与の基本フロー
- ロールを
CREATE ROLE
- ロールに権限(テーブル/ビューへの SELECT, INSERT…)を
GRANT
- ユーザID や他のロールにそのロールを
GRANT ROLE
- ロールを
-
役割階層の実装
部門長など上位者に,下位ロールをまとめて付与することで,権限を継承させる設計パターンを押さえる。 -
SQL 文のエラー回避
- ロール未作成のまま GRANT を実行するとエラー
- 存在しないユーザID に権限を付与するとエラー
これらを整理・理解しておくことで,出題意図を正しく把握し,ミスなく手順を選択できるようになります。
設問2(1):〔ビューの設計変更〕 について,(1)〜(3)に答えよ。
表3中の(d),(e)に入れる適切な字句を答えよ。
模範解答
d:INNER JOIN 又は JOIN
e:LEFT OUTER JOIN 又は LEFT JOIN
解説
1. キーワード・論点の整理
- 内部結合(INNER JOIN/JOIN)
2つのテーブルの「共通するキー値を持つ行のみ」を取り出す結合。 - 外部結合(LEFT OUTER JOIN/LEFT JOIN)
左側のテーブルのすべての行を保持し、右側に対応する行がなければNULLを補う結合。 - “NULL チェック”による絞り込み(アンチ結合)
LEFT OUTER JOIN 後にWHERE 右側の結合キー IS NULL
とすることで、「右側に対応行がない行」を抽出する手法。
2. なぜその解答になるのか
問題文では,次のように照会内容が示されています。
照会1 社員が過去に登録した訪問予定のうち, その社員が予定日に訪問しなかった顧客の顧客番号, 顧客名, 社員番号及び訪問予定日を出力する (表3の SQL3 を参照)。
この要件を実現するには,
- 「訪問予定」に登録された行のみ をベースにする
- そのうち,「訪問実績」に対応する行が存在しないもの を抽出する
という2ステップが必要です。
- (d) 訪問予定を取り込む際,「訪問予定の行のみ」を残すには 内部結合 (INNER JOIN) を使います。
- (e) 「対応する訪問実績がないものを抽出」するには,
- まず LEFT OUTER JOIN で訪問実績を結合し,
WHERE HJ.訪問実施日 IS NULL
として「訪問実績が存在しない行」を絞り込みます。
表3 の SQL3 に当てはめると,以下の通りです。
――――――――――――――――――――――――――――――――
完成形 SQL3(一例)
完成形 SQL3(一例)
SELECT
K.顧客番号,
K.顧客名,
HY.社員番号,
HY.訪問予定日
FROM
顧客 K
INNER JOIN 訪問予定 HY
ON K.顧客番号 = HY.顧客番号
LEFT OUTER JOIN 訪問実績 HJ
ON HY.顧客番号 = HJ.顧客番号
AND HY.社員番号 = HJ.社員番号
AND HY.訪問予定日 = HJ.訪問実施日
WHERE
HJ.訪問実施日 IS NULL;
3. 誤りやすいポイント
4. 試験対策として覚えておくべきポイント
- 内部結合 vs. 外部結合
- 「両者に存在するデータだけ」を使う → INNER JOIN
- 「片方にしかないデータ」も扱いたい → OUTER JOIN
- アンチ結合のパターン
LEFT OUTER JOIN ... WHERE 右側の列 IS NULL
- 対応する行がないもの(除外したい条件)を簡潔に表現できる。
- 実務/試験での注意
- 結合の向き(LEFT vs. RIGHT)を誤らない
- NULL 判定の位置(WHERE か ON か)で結果が変わる
- 結合順序と絞り込み順序を意識してSQLの実行結果をイメージする
これらを押さえると,テーブル同士の結合要件に応じた適切なJOIN句が選べるようになります。
設問2(2):〔ビューの設計変更〕 について,(1)〜(3)に答えよ。
表3 中の SQL4 において, そのままビューの定義に指定できない箇所がある。その箇所を二重線で消せ。
模範解答
SELECT S.社員番号, S.社員名, COUNT(*) 訪問回数
FROM 社員 S INNER JOIN 訪問実績 HJ ON S.社員番号 = HJ.社員番号
WHERE HJ.訪問実施日 >= ISODATE('5416-01-01')
GROUP BY S.社員番号, S.社員名
HAVING COUNT(*) > ?
解説
1. 模範解答のキーワード・論点整理
模範解答では、
HAVING COUNT(*) > ?
の部分が二重線で抹消されています。理由は 「ビューの定義は静的 SQL でなければならず、動的パラメタ “?” を含めてはいけない」 ためです。
2. なぜその解答になるのか(問題文引用で論理展開)
① 問題文(照会2の説明)
年初からの訪問回数が N 回以上の社員 … ここで,N は実行時に与えられ,SQL 文の動的パラメタの ? に設定される
② 問題文(ビュー化の理由)
F さんは … SQL 文を簡単にするために,それぞれビューを使うことにした。
③ RDBMS の一般仕様(暗黙知識)
・CREATE VIEW で定義する SQL 文は 実行時に値を差し替える構文(バインド変数,プレースホルダ)を含められない。
理由:ビューは「仮想表」を定義する DDL であり,内容が実行時に変わるような動的要素を持たせると,ビューとしての整合性が保てない。
・CREATE VIEW で定義する SQL 文は 実行時に値を差し替える構文(バインド変数,プレースホルダ)を含められない。
理由:ビューは「仮想表」を定義する DDL であり,内容が実行時に変わるような動的要素を持たせると,ビューとしての整合性が保てない。
④ したがって
ビューへ変換するとき,
ビューへ変換するとき,
HAVING COUNT(*) >= ?
に含まれる “?” プレースホルダを残すことが不可能。
ビューに動的条件を持ち込みたい場合は「ビューの外側で SELECT し直す」などの手法を採るしかない。
ビューに動的条件を持ち込みたい場合は「ビューの外側で SELECT し直す」などの手法を採るしかない。
以上の理由から,ビューの定義に指定できない箇所 = 「HAVING COUNT(*) > ?」全体 を抹消するのが正解になります。
3. 受験者が誤りやすいポイント・ひっかけ
4. 試験対策まとめ
- VIEW 定義は 静的 SQL
• バインド変数(?, :1 など)は書けない
• 変化する条件は、ビューの外側で再 SELECT する - “動的 SQL” と “静的 SQL” の違い
• アプリ側で値を差し替える → 動的
• 一切パラメタを持たない → 静的(ビュー向き) - HAVING 句は 集計結果に対するフィルタ
• ビュー側で固定閾値を書くのは可
• プレースホルダは不可 - 試験のひっかけ
• “?” を日付リテラルや列名と混同しない
• プレースホルダを消すだけ/別値に置換する誤答に注意 - 抜け・漏れチェック
• CREATE VIEW で使う SELECT は ORDER BY 句を含まないか(製品依存)
• GROUP BY 列と選択リストの整合を確認する
このあたりを押さえておけば、ビュー関連の設問で失点するリスクを大幅に減らせます。
設問2(3):〔ビューの設計変更〕 について,(1)〜(3)に答えよ。
(2)で指定できないとした箇所を除いてビューを定義する。 定義したビュー構造を,社員別訪問回数ビュー(社員番号,社員名, 訪問回数)とし,SQL4 と同じ結果行を得るために, 表3 中の SQL5(未完成)を作成した。 SQL5 の空欄に適切な字句を入れて完成させよ。 ただし, 結果行の並び順については, 考慮しなくてよい。
模範解答
SELECT 社員番号, 社員名, 訪問回数 FROM 社員別訪問回数ビュー
WHERE 訪問回数 >= ?
解説
キーワードと論点整理
- ビュー(
社員別訪問回数ビュー
)を利用して集計結果を取得する - 動的パラメータ
?
による検索条件の適用 - 集計結果(
訪問回数
)に対しての絞り込みはビュー外でWHERE
を使う
解答に至る論理的説明
-
【問題文】のSQL4では、次のように社員ごとの訪問回数を集計し、
HAVING
で動的パラメータ?
以上の社員を抽出しています。「HAVING COUNT(*) ≥ ?」SELECT S.社員番号, S.社員名, COUNT(*) 訪問回数 FROM 社員 S INNER JOIN 訪問実績 HJ ON S.社員番号 = HJ.社員番号 WHERE HJ.訪問実施日 >= ISODATE('2016-01-01') GROUP BY S.社員番号, S.社員名 HAVING COUNT(*) >= ?
-
小問(2)では、同じ集計結果をあらかじめ定義したビュー
社員別訪問回数ビュー(社員番号, 社員名, 訪問回数)
から取得することが求められています。- ビュー定義の中で既に
GROUP BY
とCOUNT(*) AS 訪問回数
を行っているため、呼び出し側(SQL5)では再度GROUP BY
は不要です。 - 結果として、ビュー外では集計済みの列
訪問回数
に対して 通常のWHERE句 で絞り込みを行います。
- ビュー定義の中で既に
-
したがって、SQL5の空欄には、「HAVING COUNT(*) ≥ ?」 に対応させた条件として、
訪問回数 ≥ ?
を記述します。 -
模範解答のとおり、SQL5は以下のように完成します。
SELECT 社員番号, 社員名, 訪問回数 FROM 社員別訪問回数ビュー WHERE 訪問回数 >= ?
受験者が誤りやすいポイント
試験対策として覚えておくべきポイント
-
ビューと集計
- ビュー定義内で
GROUP BY
+COUNT(*)
などを行った場合、呼び出し側のSQLでは集計関数を使わず、通常の列として扱う。
- ビュー定義内で
-
WHERE句とHAVING句の使い分け
- WHERE句:集計前の行フィルタリングに用いる(集計関数は使えない)。
- HAVING句:GROUP BY後のグループ単位の絞り込みに用いる。
-
動的パラメータ
?
の位置- 集計済みの列に対する比較条件は、ビュー外ではWHERE句で指定する。
-
ビューを活用したSQLの簡素化
- 複雑なJOINやGROUP BYはビューにまとめ、呼び出し側ではシンプルなSELECT文で済ませることで、可読性と保守性を向上できる。
設問3(1):〔セキュリティ要件の強化〕 について,(1)〜(3)に答えよ。
“チームメンバ” テーブルの構造を示せ。 主キーには実線の下線を付けること。
模範解答
チームメンバ(部門番号, チーム番号, 社員番号, 担当開始日, 担当終了日)
解説
キーワード・論点整理
- チームメンバテーブル:セキュリティ要件強化で新設されたテーブル
- 登録項目:部門番号、チーム番号、社員番号、担当開始日、担当終了日
- 主キー:同一社員が同一チームに複数期間所属できるため、担当開始日を含む複合キー
- 設計要件引用:
- 「営業課内のチームの社員ごとに, 担当開始日及び担当終了日を設定した行を登録する」
- 「当該テーブルへのアクセス権限…を課長に与え…」
解答の導出過程
- 【問題文】の〈セキュリティ要件の強化〉において、
「(1) 営業支援システムに, 新たに “チームメンバ” テーブルを追加する。…
(b) 営業課内のチームの社員ごとに, 担当開始日及び担当終了日を設定した行を登録する。」
とあることから、テーブルのカラムは以下の5つであることがわかります。- 部門番号
- チーム番号
- 社員番号
- 担当開始日
- 担当終了日
- 主キー設定の考え方
- 「同じチームの社員ごとに 期間を区切って 登録できる」ため、
担当開始日を含めなければ過去と現在の重複を区別できません。 - 担当終了日は後から変更したりNULLを許容したりするため、
主キーから外すのが一般的です。
- 「同じチームの社員ごとに 期間を区切って 登録できる」ため、
- 以上より、主キーは複合キーとして
部門番号+チーム番号+社員番号+担当開始日
の4列を選択します。
テーブル構造(解答例)
主キー:部門番号, チーム番号, 社員番号, 担当開始日
受験者が誤りやすいポイント
- 担当終了日を主キーに含める
→終了日は変更・NULL許容のため、一意性維持に不向き - チーム番号だけを主キーにする
→同一チーム内の複数社員や同一社員の複数期間を区別できない - サロゲートキー(自動採番)を要求されたと誤解
→設問は「構造を示せ」とあるため、与えられた要件の列と複合キーを答える
試験対策ポイント
- 複合主キーの設計基準
- 期間管理が必要な履歴テーブルは日時を主キーに含める
- NULL許容列は主キーに含めない
- 設問文の要件を正確に読み取る
- 「~ごとに…行を登録する」の表現から必須カラムを抽出
- 主キー設定の理由付けに「設計要件」を引用して解答
- テーブル設計の基本
- 意味のあるユニーク性を保つ複数列の組み合わせ
- 更新や変更の要件から主キー/ユニーク制約を再検討
以上のポイントを押さえておくと、テーブル設計問題で安定して得点できます。
設問3(2):〔セキュリティ要件の強化〕 について,(1)〜(3)に答えよ。
図1中の社員のうち、個人情報へのアクセスが許可されているにもかかわらず,表4のSQL6 では期待した結果を得られない社員がいる。その社員の社員番号を全て答えよ。 また、 解決策として, “チームメンバ” テーブルに対して行うべき行の操作を, 30字以内で具体的に述べよ。
模範解答
社員番号:E111, E112, E116
操作:・部長を全チームに, 課長を各チームにメンバとして登録する。
・各チームの社員の部門長をメンバとして登録する。
解説
キーワードと論点整理
-
SQL6 の結合条件
… FROM 顧客 K INNER JOIN チームメンバ T ON K.担当部門番号 = T.部門番号 AND K.チーム番号 = T.チーム番号 WHERE T.社員番号 = CURRENT_USER AND …
→T.社員番号 = CURRENT_USER
を満たす行だけビューに現れる -
チームメンバ テーブル未登録者は結果に現れない
→ 部長・課長はチーム編成をシステム外で管理していたため、チームメンバ表に登録されておらず、SQL6 の条件を満たせない -
対象社員(図1 より)
これらは「チームメンバ」テーブルに行がないため、SQL6 実行時に結果を得られない。
解答の論理的説明
-
ビュー定義(SQL6)の確認
問題文より「CREATE VIEW 営業課ビュー AS … INNER JOIN チームメンバ T … WHERE T.社員番号 = CURRENT_USER …」
とあり、- ビュー参照時には必ずチームメンバ表に現行ユーザの行が存在し、
担当開始日 ≤ CURRENT_DATE
かつ担当終了日 ≥ CURRENT_DATE OR NULL
の条件を満たす必要がある。
-
登録漏れ社員の抽出
図1 より、SQL6 実行時に閲覧権限を持つのは営業部長・各課長・各チームの社員であるが、- 営業部長(E111)
- 営業1課長(E112)
- 営業2課長(E116)
は「チームメンバ」テーブルに行がまだ登録されていないため、
T.社員番号 = CURRENT_USER
の条件を満たさず、個人情報が取得できない。
-
よって解答は
- 社員番号:E111, E112, E116
解決策(チームメンバ テーブルへの具体的行操作)
「チームメンバ」テーブルに対して
- 部長を全チームに、課長を各チームにメンバとして登録する行を INSERT する
(30字以内)
全チームに部長を、各チームに課長をメンバ登録する。
受験者が誤りやすいポイント
- 「システム外で管理」「課長が登録操作可能」 の記述に注目し過ぎて、実際にチームメンバ表への登録漏れが起こることに気づかない。
- ビューで CURRENT_USER を使った場合、権限・ロールだけでなく主キー制約で存在しないと何も返さない点を見落としがち。
試験対策として覚えておくべき知識
- ビューに CURRENT_USER や SESSION_USER を使う場合、必ずJOIN 先のテーブルに当該ユーザの行を用意する必要がある。
- セキュリティ要件で「即時反映」を求める場合、RBAC(Role-Based Access Control)だけでなくデータ操作による行レベル制御も漏れなく設計する。
- 複数階層の組織(部長・課長・メンバ)を扱う場合、最上位者も下位テーブルに登録しないとビューから漏れるリスクがあることを意識する。
設問3(3):〔セキュリティ要件の強化〕 について,(1)〜(3)に答えよ。
セキュリティ要件 ④におけるアクセス制限の実施について, 対応案Bが対応案Aに比べて優れている理由を, 40字以内で具体的に述べよ。
模範解答
・課長は,社員の行の担当終了日を更新することで直ちにアクセスを制限できるから
・課長は,DBA にロールの剥奪を 1 営業日前までに依頼する必要がないから
解説
1. 模範解答のキーワード・論点整理
- 「課長は,社員の行の担当終了日を更新することで直ちにアクセスを制限できる」
- 「課長は,DBA にロールの剥奪を 1 営業日前までに依頼する必要がない」
これらは、対応案A(チーム別ロールによる運用)に比べて、対応案B(チームメンバ表と動的ビューによる運用)が即時性と運用負荷低減の点で優れていることを示しています。
2. 解答の論理的な説明
- セキュリティ要件④では,「個人情報にアクセスする必要がなくなった社員については,そのことを反映するためのアクセス制限を直ちに実施する」ことが求められています。
- 対応案A(チーム別ロール)では,課長が社員を異動・解任するたびに「DBA にロールの付与・剥奪を 1 営業日前までに依頼」しなければならず,最短でも 1 日のタイムラグが発生します。
- 問題文:「課長が 1営業日前までにデータベース管理者(DBA)に依頼する。DBAは…ロールの付与・剥奪を RDBMS に対して実施する。」
- 対応案Bでは,「チームメンバ」テーブルの 担当終了日 を課長自身が随時更新でき,ビュー側では
T.担当終了日 >= CURRENT_DATE OR T.担当終了日 IS NULL
の条件によってアクセス権限を動的に判定します(SQL6)。- SQL6 抜粋:
... WHERE T.社員番号 = CURRENT_USER AND T.担当開始日 <= CURRENT_DATE AND (T.担当終了日 >= CURRENT_DATE OR T.担当終了日 IS NULL)
- この仕組みでは,課長が担当終了日を「前日までの日付」や「当日以前の日付」に書き換えれば,その瞬間から対象社員はビューに行を見られなくなります。
- SQL6 抜粋:
- したがって,対応案Bは「直ちにアクセス制限を実施できる」とともに,「DBA への依頼が不要で運用負荷が低い」という2つの利点を同時に満たします。
3. 受験者が誤りやすいポイント
- 「CURRENT_USER」「CURRENT_DATE」などビルトイン関数を使った動的条件の意味を取り違える
→ ビュー内の条件とテーブル更新を組み合わせることで,権限変更の即時反映が可能になる点を押さえること。 - 対応案Aの手順だけを想像し,「ロールを剥奪すれば瞬時にアクセス制限できる」と考えてしまう
→ 問題文で「1営業日前までにDBAに依頼」という運用ルールが必ず介在する点を見逃さないこと。
4. 試験対策として覚えておくべきポイント
- ビューに組み込んだ日付・ユーザ判定条件と運用ルールを組み合わせることで,DBA 介在を不要にし,アクセス制御の即時性を高められる
- 「ロールによる権限付与・剥奪」は管理者(DBA)への依頼フローがボトルネックになる場合がある
- 動的ビューとジョイン条件を使った行レベルセキュリティ(Row‐Level Security)の考え方
CURRENT_USER
/CURRENT_DATE
といったビルトイン関数の役割と,アクセス制御への応用方法