データベーススペシャリスト試験 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のように変更する。

RDBMS のセキュリティに関する次の記述を読んで、 設問1〜3に答えよ。
設問1:〔ビュー及びロールの設計〕 について,(1),(2)に答えよ。
(1)表2中の(a)〜(c)に入れる適切な字句を答えよ。模範解答
a:B11
b:B12
c:B10
解説
解答の論理構成
- ロール命名規則
【問題文】「(1) 部門番号をロール名として,ロールを定義する。」
→ 部門番号そのものがロール名。 - ビューと部門番号の対応
- “営業1課ビュー” 定義:
【表1 SQL1】WHERE 担当部門番号 = 'B11'
→ (a) はロール「B11」。 - “営業2課ビュー” 定義(SQL2 は伏せ字だが, 営業2課であることは文脈より明白)。部門番号は図1より「B12」。
→ (b) はロール「B12」。
- “営業1課ビュー” 定義:
- 上位ロールへの付与
【表2】GRANT ROLE (a), (b) TO (c) ;
営業1課(B11), 営業2課(B12) のロールをまとめて付与されるのは営業部。図1で営業部の部門番号は「B10」。
→ (c) はロール「B10」。
誤りやすいポイント
- ビュー名だけを見て “営業1課ビュー=ロールB10?” と混同する。ビューは課単位, ロールB10は部全体です。
- 「GRANT SELECT ON … TO (a)」の
(a)
をユーザIDと誤読し, E113 など社員番号を入れてしまう。ここはロールです。 GRANT ROLE … TO …
の文法で, 右側が下位ロールと早合点し逆に配置する。右側は付与先(上位)です。
FAQ
Q: (c) に「E111」を入れてはいけないのですか?
A: いけません。
A: いけません。
GRANT ROLE (a), (b) TO (c) ;
は「ロールをロールへ付与」する文で, 付与先はロール名です。社員個人(ユーザID)を指定する場合は表2の「イ」のように GRANT ROLE B10 TO E111 ;
が別途用意されています。Q: ロールを階層付けすると何が便利ですか?
A: 下位ロール(B11,B12)に付与した権限を上位ロール(B10)にまとめて継承できるため, 部長交代時は上位ロールを別ユーザに付け替えるだけで済み, メンテナンス工数を削減できます。
A: 下位ロール(B11,B12)に付与した権限を上位ロール(B10)にまとめて継承できるため, 部長交代時は上位ロールを別ユーザに付け替えるだけで済み, メンテナンス工数を削減できます。
Q: ビュー経由でしか個人情報にアクセスさせない理由は?
A: 【問題文】セキュリティ要件③「個人情報が格納されているテーブルを隠蔽するために, 社員にはビューを使わせ、テーブルには直接アクセスさせない。」とある通り, 直接テーブルにアクセスさせないことで列の取捨選択・行フィルタリングを強制でき, 不要な情報漏えいを防げます。
A: 【問題文】セキュリティ要件③「個人情報が格納されているテーブルを隠蔽するために, 社員にはビューを使わせ、テーブルには直接アクセスさせない。」とある通り, 直接テーブルにアクセスさせないことで列の取捨選択・行フィルタリングを強制でき, 不要な情報漏えいを防げます。
関連キーワード: ロールベースアクセス制御, GRANT文, ビュー, 部門階層, アクセス権継承
設問1:〔ビュー及びロールの設計〕 について,(1),(2)に答えよ。
(2)表2のア〜ケで示した SQL文を正しい順に並べ替えよ。なお,正しい順は複数通りあるが,そのうちの一つを答えよ。 ( )→( )→( )→( )→( )→( )→( )→( ク )→( ケ ) 注記 オ,カ,キは順不同,及び,イ,ウ,エ,アは順不同模範解答
(オ) → (カ) → (キ) → (イ) → (ウ) → (エ) → (ア) → (ク) → (ケ)
解説
解答の論理構成
- ロールの作成
「CREATE ROLE B10 ;」「CREATE ROLE B11 ;」「CREATE ROLE B12 ;」はロールの定義そのものなので最優先。
よって (オ),(カ),(キ) を最初に置く。 - ロールをユーザへ付与
ロールが存在した後でなければ付与できないため,
「GRANT ROLE B10 TO E111 ;」「GRANT ROLE B11 TO E112, E113, E114, E115 ;」
「GRANT ROLE B12 TO E116, E117, E118, E119 ;」を続ける。これが (イ),(ウ),(エ)。 - ロール階層(部長ロールが課ロールを包含)
「GRANT ROLE (a), (b) TO (c) ;」は【問題文】「② 部門長は、部下がアクセスできる全ての情報にアクセスできる。」を実現するために,
子ロール「B11」「B12」を親ロール「B10」に付与する操作。(ア) は両ロールが既に作成・付与済みである必要がある。 - ビューへの権限付与
最後に「GRANT SELECT ON 営業1課ビュー TO (a) ;」「GRANT SELECT ON 営業2課ビュー TO (b) ;」でビューの参照権限をロールに付与する。(ク),(ケ)。
これで個人情報を格納するビューに直接アクセスさせつつ,テーブルを隠蔽する【問題文】③を満たす。
誤りやすいポイント
- (ア) をロール作成前に置いてしまい,存在しないロールに対して GRANT してエラーになる。
- 「CREATE ROLE」と「GRANT ROLE TO USER」の順序を混同しがち。作成前に付与は不可。
- ビューへの GRANT をロール付与より先に書くと「権限は付与できても結局誰もそのロールを持っていない」状態になる。
FAQ
Q: (オ),(カ),(キ) の内部順序は固定ですか?
A: いいえ。いずれも「CREATE ROLE」で相互依存が無いため,3文の順序は問いません。
A: いいえ。いずれも「CREATE ROLE」で相互依存が無いため,3文の順序は問いません。
Q: もし部門長が後から部下ロールを継承しても,既に付与済みのユーザ権限は有効ですか?
A: 有効です。ロールに対する変更は,そのロールを持つ全ユーザに即時反映されます。
A: 有効です。ロールに対する変更は,そのロールを持つ全ユーザに即時反映されます。
Q: ビュー作成とビューへの権限付与の順序は?
A: 通常は「CREATE VIEW」→「GRANT SELECT …」です。本設問ではビュー定義は既出なので,権限付与だけを最後に行います。
A: 通常は「CREATE VIEW」→「GRANT SELECT …」です。本設問ではビュー定義は既出なので,権限付与だけを最後に行います。
関連キーワード: ロールベースアクセス制御, GRANT, ビュー, 階層型権限, RDBMS
設問2:〔ビューの設計変更〕 について,(1)〜(3)に答えよ。
(1)表3中の(d),(e)に入れる適切な字句を答えよ。模範解答
d:INNER JOIN 又は JOIN
e:LEFT OUTER JOIN 又は LEFT JOIN
解説
解答の論理構成
- 抽出条件の再確認
“社員が過去に登録した訪問予定のうち, その社員が予定日に訪問しなかった顧客” を探す―これは予定行は必須、実績行は存在しない(HJ.訪問実施日 IS NULL
)状況です。 - 顧客 K と 訪問予定 HY の結合
予定に登場しない顧客は対象外なので、行の組み合わせは 1 対 1 もしくは 1 対 多ですが「予定を持つ顧客だけ欲しい」。したがって外部結合は不要で内部結合を行います。
引用:【問題文】「顧客 K…訪問予定 HY…K.顧客番号 = HY.顧客番号」
→ (d) にINNER JOIN
を設定。 - 訪問予定 HY と 訪問実績 HJ の結合
実績が無い行を残したいので外部結合が必要です。外側にするのは予定表側で、実績表を NULL で保持します。
引用:【問題文】「WHERE HJ.訪問実施日 IS NULL」
→ (e) にLEFT OUTER JOIN
を設定。 - 句の選択肢
SQL 標準ではINNER
/LEFT OUTER
を省略してJOIN
/LEFT JOIN
と書けるため、両者とも正答扱いになります。
誤りやすいポイント
- “NULL を取るから RIGHT JOIN だ” と逆に考えてしまう
必要なのは予定の行を基準に実績の有無を確認する LEFT JOIN です。 - すべて外部結合にしてしまい結果行が増える
顧客-予定間を外部結合にすると、予定を持たない顧客まで対象になり誤答になります。 - WHERE 句で
IS NULL
を付けた後に内部結合に変換してしまう
内部結合では NULL 行が消えるため目的を達成できません。
FAQ
Q:
A: 意味は同じです。
LEFT JOIN
と LEFT OUTER JOIN
の違いはありますか?A: 意味は同じです。
OUTER
を省略できるのが SQL 標準で、実装による違いはありません。Q: INNER JOIN を CROSS JOIN+WHERE 句に書き換えても正しいですか?
A: 論理的には同じ結果を得られますが、設問は
A: 論理的には同じ結果を得られますが、設問は
(d)
の字句を問うており、INNER JOIN
(または JOIN
)を求めています。Q: RIGHT JOIN を使っても書けるのでは?
A: 訪問実績 HJ を基準に右外部結合すれば書けますが、設問の文脈では LEFT JOIN が自然であり、容易に理解できるように LEFT JOIN が期待されています。
A: 訪問実績 HJ を基準に右外部結合すれば書けますが、設問の文脈では LEFT JOIN が自然であり、容易に理解できるように LEFT JOIN が期待されています。
関連キーワード: INNER JOIN, LEFT OUTER JOIN, 外部結合, NULL判定, 結合条件
設問2:〔ビューの設計変更〕 について,(1)〜(3)に答えよ。
(2)表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(*) > ?
解説
解答の論理構成
- 【問題文】では SQL4 をビュー化するとして「そのままビューの定義に指定できない箇所がある」と述べています。
- SQL4 の可変要素は
HAVING COUNT(*) >= ?
(模範解答ではHAVING COUNT(*) > ?
)だけです。 - ビューは「スキーマ定義」の一種であり、RDBMS は CREATE VIEW 時点で全文をパース・最適化します。
?
のような実行時バインド変数はこの段階では不定であり、「不定値を含む式」は構文エラーになります。 - したがってビューに残せない箇所は
HAVING COUNT(*) > ?
となり、【模範解答】でも二重線で取り消されています。 - ビュー化する場合は
としておき、呼び出し側でCREATE VIEW 社員別訪問回数ビュー AS SELECT S.社員番号, S.社員名, COUNT(*) 訪問回数 FROM 社員 S INNER JOIN 訪問実績 HJ ON S.社員番号 = HJ.社員番号 WHERE HJ.訪問実施日 >= ISODATE('5416-01-01') GROUP BY S.社員番号, S.社員名 ;
のように条件を移すのが典型的な実装パターンです。SELECT * FROM 社員別訪問回数ビュー WHERE 訪問回数 >= ? ;
誤りやすいポイント
- 「ビューでもプレースホルダは使えるはず」と思い込む。ビューはプリコンパイルされるため NG です。
HAVING
句そのものが禁止と誤解し、集計列を SELECT から外してしまう。GROUP BY
を残さずに削除箇所を誤る。GROUP BY
は集計ビューの本質なので必要です。
FAQ
Q: ビュー内で変数やプレースホルダを使う方法はありますか?
A: 標準 SQL ではありません。必要ならストアドプロシージャやアプリ層でパラメタを受け取り、ビューとは別に動的 SQL を生成します。
A: 標準 SQL ではありません。必要ならストアドプロシージャやアプリ層でパラメタを受け取り、ビューとは別に動的 SQL を生成します。
Q:
A: RDBMS によってはビューの結果に対してさらに WHERE を付けると結合最適化が働き、実質的に同じ実行計画になります。実行計画を確認して問題があればマテリアライズドビューなどを検討します。
HAVING
条件をアプリ側に移すとパフォーマンスは落ちませんか?A: RDBMS によってはビューの結果に対してさらに WHERE を付けると結合最適化が働き、実質的に同じ実行計画になります。実行計画を確認して問題があればマテリアライズドビューなどを検討します。
Q:
A: 問題設定どおりに記述しますが、実システムではビュー定義に年度開始日を固定すると変更コストが高いので、別テーブルに基準日を保持するか、年度ごとにビューを作り直す運用を取るのが一般的です。
ISODATE('5416-01-01')
の固定日付はハードコーディングして良いのでしょうか?A: 問題設定どおりに記述しますが、実システムではビュー定義に年度開始日を固定すると変更コストが高いので、別テーブルに基準日を保持するか、年度ごとにビューを作り直す運用を取るのが一般的です。
関連キーワード: ビュー定義, 動的パラメータ, HAVING句, 集計関数, アクセス制御
設問2:〔ビューの設計変更〕 について,(1)〜(3)に答えよ。
(3)(2)で指定できないとした箇所を除いてビューを定義する。 定義したビュー構造を,社員別訪問回数ビュー(社員番号,社員名, 訪問回数)とし,SQL4 と同じ結果行を得るために, 表3 中の SQL5(未完成)を作成した。 SQL5 の空欄に適切な字句を入れて完成させよ。 ただし, 結果行の並び順については, 考慮しなくてよい。模範解答
SELECT 社員番号, 社員名, 訪問回数 FROM 社員別訪問回数ビュー
WHERE 訪問回数 >= ?
解説
解答の論理構成
- 出力列を決める
要件より【問題文】「社員番号, 社員名,訪問回数を出力」→SELECT 句に3列すべてを書く必要がある。表3の SQL5 に下線が2か所あるのは SELECT 句が欠けているため。 - 抽出条件を決める
表3の SQL4 は
HAVING COUNT() >= ?
となっており、これをビュー使用後も引き継ぐ必要がある。ビュー側で COUNT() にエイリアス「訪問回数」を付けているので、SQL5 では
WHERE 訪問回数 >= ?
と書けば同じ意味になる。 - GROUP BY/HAVING が不要な理由
ビューで集計済み(社員別訪問回数ビュー:社員番号, 社員名, 訪問回数)なので、呼び出し側は通常の SELECT と WHERE だけで済む。
誤りやすいポイント
- HAVING をそのまま書いてしまう
ビュー側で集計済みなので HAVING では構文エラーになる。 - COUNT(*) を直接参照する
ビューでは列名が「訪問回数」になっている。 - 動的パラメタ「?」を書き忘れる/別名に置き換える
要件に「? に設定される」と明示されている。
FAQ
Q: HAVING 句を残しても動く DB もあるのでは?
A: ビューには GROUP BY が含まれていないため、HAVING を付けると ANSI SQL 的にはエラー。WHERE 句が安全です。
A: ビューには GROUP BY が含まれていないため、HAVING を付けると ANSI SQL 的にはエラー。WHERE 句が安全です。
Q: エイリアス「訪問回数」は必ず必要?
A: 呼び出し側が COUNT(*) を意識せず業務用語でフィルタできるように付けている。テーブル設計と同じく列名は意味を持たせた方が運用しやすいです。
A: 呼び出し側が COUNT(*) を意識せず業務用語でフィルタできるように付けている。テーブル設計と同じく列名は意味を持たせた方が運用しやすいです。
関連キーワード: ビュー, アクセス権限, ロール, 動的SQL, 集計関数
設問3:〔セキュリティ要件の強化〕 について,(1)〜(3)に答えよ。
(1)“チームメンバ” テーブルの構造を示せ。 主キーには実線の下線を付けること。模範解答
チームメンバ(部門番号, チーム番号, 社員番号, 担当開始日, 担当終了日)
解説
解答の論理構成
- 主キー候補の抽出
- “営業課内で一意なチーム番号” → “チーム番号” は “部門番号” と対で初めて全社的に一意。
- “営業課内のチームの社員ごとに, 担当開始日及び担当終了日を設定” → 同じ社員が同じチームに再参加するケース (要件(d)) を許容するため,開始日を主キーに含める必要がある。
- 列の確定
【問題文】引用
“(b) 営業課内のチームの社員ごとに, 担当開始日及び担当終了日を設定した行を登録する。”
→ 期間属性は “担当開始日”, “担当終了日”。
“(e) 過去にどの社員がどのチームのメンバだったかを調べることができる。”
→ 履歴保持用に終了日を持たせる。 - 主キー決定
以上より,主キーは (部門番号, チーム番号, 社員番号, 担当開始日)。
終了日は履歴検索用の通常列。
誤りやすいポイント
- “担当終了日” を主キーに含める誤り
→ NULL になり得る列は主キーにできません。 - “部門番号” を省く誤り
→ “営業課内で一意” の文言に注意。全社での一意性を保証するには部門番号が必要です。 - 開始日と終了日を 1 行で管理せず履歴を上書きする設計
→ 要件(e) の履歴参照が不可能になります。
FAQ
Q: “担当終了日” が NULL の行が複数できた場合でも一意性は保たれますか?
A: 主キーに含まれていないため問題ありません。現在担当分は開始日で一意に区別できます。
A: 主キーに含まれていないため問題ありません。現在担当分は開始日で一意に区別できます。
Q: “担当開始日” を主キーに入れず別に連番を持たせても良いですか?
A: 可ですが,業務キー優先の設計が求められる試験では不要な人工キーは避けるのが無難です。
A: 可ですが,業務キー優先の設計が求められる試験では不要な人工キーは避けるのが無難です。
Q: 課長のみが更新できるという制約はテーブル定義で表現する必要がありますか?
A: 権限管理はロール付与で実現する想定なので,テーブル構造には含めません。
A: 権限管理はロール付与で実現する想定なので,テーブル構造には含めません。
関連キーワード: 主キー, 履歴管理, 参照制約, 期間属性, アクセス権限
設問3:〔セキュリティ要件の強化〕 について,(1)〜(3)に答えよ。
(2)図1中の社員のうち、個人情報へのアクセスが許可されているにもかかわらず,表4のSQL6 では期待した結果を得られない社員がいる。その社員の社員番号を全て答えよ。 また、 解決策として, “チームメンバ” テーブルに対して行うべき行の操作を, 30字以内で具体的に述べよ。模範解答
社員番号:E111, E112, E116
操作:・部長を全チームに, 課長を各チームにメンバとして登録する。
・各チームの社員の部門長をメンバとして登録する。
解説
解答の論理構成
- 権限の付与状況
- 【問題文】表2 の「GRANT ROLE B10 TO E111」「GRANT ROLE B11 TO E112」「GRANT ROLE B12 TO E116」より、部長・課長は各営業課ビューへの
SELECT
権限を保有します。
- 【問題文】表2 の「GRANT ROLE B10 TO E111」「GRANT ROLE B11 TO E112」「GRANT ROLE B12 TO E116」より、部長・課長は各営業課ビューへの
- SQL6 のフィルタ条件
- SQL6 の
WHERE T.社員番号 = CURRENT_USER
と日付条件により、チームメンバ表に “自分自身” が行として存在しなければ抽出されません。
- SQL6 の
- 誰が登録されていないか
- チームは【問題文】「(4) 課長は、部下社員から成る少人数の営業チーム…」で編成され、部長・課長自身がメンバになるとは書かれていません。
- よって “チームメンバ” に行がない「E111」「E112」「E116」は SQL6 でヒットせず、期待結果を取得できません。
- 必要な操作
- 解決策は部長・課長をチームメンバ表へ登録すること。これにより
CURRENT_USER
条件を満たしアクセスが可能になります。
- 解決策は部長・課長をチームメンバ表へ登録すること。これにより
誤りやすいポイント
- 「ロールを持っていれば SQL6 でも必ず見える」と思い込む。ビュー側で更に条件が課されている点を見落としやすいです。
CURRENT_USER
を“社員番号”ではなく“ユーザID”と誤解して別物と考えてしまう。問題設定では社員番号=ユーザIDです。- 担当終了日が
NULL
の場合の OR 条件を読む際に “過去の行まで見える” と誤解し、現時点の行のみ抽出されることを忘れる。
FAQ
Q: チームメンバ表へ登録する際、日付列はどう設定しますか?
A: 【問題文】(1)(b)「担当終了日が未定の場合は, NULL を設定する。」に従い、現時点で終了予定がない場合は
A: 【問題文】(1)(b)「担当終了日が未定の場合は, NULL を設定する。」に従い、現時点で終了予定がない場合は
担当終了日 = NULL
で登録します。Q: ロールをチーム単位に細分化する案(対応案A)はなぜ採用しなかったのですか?
A: 課長が随時チーム編成を変える【問題文】「(7) 課長は,随時, チーム編成を変える。」ため、ロール管理が頻繁になり DBA の負荷が増大するからです。チームメンバ表で動的に判定する方が運用が簡単です。
A: 課長が随時チーム編成を変える【問題文】「(7) 課長は,随時, チーム編成を変える。」ため、ロール管理が頻繁になり DBA の負荷が増大するからです。チームメンバ表で動的に判定する方が運用が簡単です。
Q: 日付条件があるのに過去のメンバを調査できるのは?
A: 【問題文】(1)(e)「過去にどの社員がどのチームのメンバだったかを調べることができる。」ため、課長向け機能では日付条件を外した検索が別途用意される想定です。SQL6 は“現在アクセス”用のビューです。
A: 【問題文】(1)(e)「過去にどの社員がどのチームのメンバだったかを調べることができる。」ため、課長向け機能では日付条件を外した検索が別途用意される想定です。SQL6 は“現在アクセス”用のビューです。
関連キーワード: ビュー, ロール, アクセス制御, CURRENT_USER, JOIN
設問3:〔セキュリティ要件の強化〕 について,(1)〜(3)に答えよ。
(3)セキュリティ要件 ④におけるアクセス制限の実施について, 対応案Bが対応案Aに比べて優れている理由を, 40字以内で具体的に述べよ。模範解答
・課長は,社員の行の担当終了日を更新することで直ちにアクセスを制限できるから
・課長は,DBA にロールの剥奪を 1 営業日前までに依頼する必要がないから
解説
解答の論理構成
- セキュリティ要件④は「アクセスする必要がなくなった社員については,そのことを反映するためのアクセス制限を直ちに実施する。」
- 対応案A(ロールをチーム別に再設計)では、【問題文】「ロールの付与・剥奪については,課長が 1営業日前までに…DBA …実施」とあり、即時制限ができない。
- 対応案Bは
- 「新たに “チームメンバ” テーブルを追加」
- 「担当終了日列を、いつでも変更することができる。」
- ビュー SQL6 で
WHERE T.担当終了日 >= CURRENT_DATE OR T.担当終了日 IS NULL
と判定。
- したがって課長は自席で担当終了日を当日に更新すれば即座にビューの結果から個人情報が除外される。
- DBA への申請・反映待ちが不要になる分、迅速性と運用負荷の両面で優れている。
誤りやすいポイント
- 「担当終了日を NULL→日付」に更新するだけで良い点を見落とし、チームメンバ行の削除や INSERT を想定してしまう。
- ロール剥奪のリードタイムを“1日程度”と曖昧に書き、【問題文】の「1営業日前まで」の正確な引用を欠く。
- DBA という第三者操作が無くなるメリットではなく、チーム番号追加の可読性など別観点で答えてしまう。
FAQ
Q: DBA が担当終了日更新を行うケースはありますか?
A: ありません。対応案Bでは【問題文】「当該テーブルへのアクセス権限…を課長に与え」と明記しており、課長自身が操作します。
A: ありません。対応案Bでは【問題文】「当該テーブルへのアクセス権限…を課長に与え」と明記しており、課長自身が操作します。
Q: 担当終了日を未来日に設定したまま放置すると権限が残りませんか?
A: 残ります。そのため課長は異動・離脱が決まった時点で日付を当日以前に修正し、最小権限原則を維持する運用が必要です。
A: 残ります。そのため課長は異動・離脱が決まった時点で日付を当日以前に修正し、最小権限原則を維持する運用が必要です。
Q: ビュー SQL6 の
A: ログインID(社員番号)とチームメンバ表の社員番号が一致する行だけを抽出し、本人が所属するチームの顧客しか表示しない仕組みです。
CURRENT_USER
判定は何を意味しますか?A: ログインID(社員番号)とチームメンバ表の社員番号が一致する行だけを抽出し、本人が所属するチームの顧客しか表示しない仕組みです。
関連キーワード: アクセス制御, ロール管理, 最小権限原則, 動的ビュー