ここでは、データベーススペシャリスト試験の対策として、トリガーとレプリケーションの問題を扱った過去問の解説を紹介します。対象は、令和4年度午後1問2の問題となります。
設問2では、トリガー(BEFORE・AFTER)の違いへの理解について、
設問3では、レプリケーション(同期・非同期)の違いへの理解について問われた問題でした。
出題要旨
| 設問 | テーマ | 技術要素 | 問われた理解の焦点 | キーワード・要点 |
|---|---|---|---|---|
| 設問2 | トリガーの動作タイミング | BEFORE/AFTERトリガー | 更新操作の前後での処理の違いを理解できているか。BEFOREではNEWの変更が可能、AFTERでは他テーブル更新が可能。 | – BEFORE:データ補正(例:NULL→現在日付)- AFTER:履歴登録(例:更新前行を履歴テーブルへ)- OLD/NEWの使い分け |
| 設問3 | レプリケーションの処理方式 | 同期/非同期レプリケーション | 性能と整合性のトレードオフを理解できているか。どちらを選択すべきかを業務特性から判断できるか。 | – 同期:複製先の書き込み完了を待つ→確実だが遅い- 非同期:待たない→高速だが整合性リスクあり- 見積システムでは非同期が適する |

DB試験R04午後1問2より抜粋
設問1(1)❌
設問1(3);トリガーを定義するSQL文

空欄(e);BEFORE
目的;”商品”テーブル更新時に、適用開始日がNULLの場合、現在日付に更新する。
操作後の行の内容を変更できるのは、BEFOREトリガーになる。
空欄(f);AFTER
空欄(g);OLD2
空欄(h);NEW2
目的;”商品”テーブルの更新時に、対象行の更新前の行を”商品履歴”テーブルに挿入する。この時、挿入行の適用終了日には、更新後の行の適用開始日の前日を設定する。
空欄(g)には、他の項目から更新前の行の挿入に関する部分だと考えられる。その中で、まだ記述されていない部分は、「適用開始日」である。更新前の「適用開始日」を表示させたいので、「OLD2」とする。
空欄(h)には、「更新後の行の適用開始日の前日」に対する文が入る。更新後のテーブルに該当するのは「NEW2」なので、これが答えになる。
空欄(f)は、変更操作後の更新行に対して操作を行っているので、「AFTER」が入る。
”商品”テーブルの更新後に、”商品履歴”テーブルの更新を行なっている。
①”商品”テーブルの情報を更新する。
②”商品履歴”テーブルに「更新後の行の適用開始日の前日」を挿入する。
「更新後の行の適用開始日の前日を設定」がAFTERトリガーの仕様の「変更操作の後(①)に実行され、他のテーブルに対する変更操作を行うことができる(②)に当たる。
ポイント
ポイント
⬛︎トリガーにおけるBEFOREとAFTERの違い
☆トリガー処理の対象が、「変更操作前」か「変更捜査後」かによって判断する。
・BEFORE;変更操作前の行に対して行いたい場合
・AFTER:変更操作後の行に対して行いたい場合
| 項目 | BEFOREトリガー | AFTERトリガー |
|---|---|---|
| 実行タイミング | 変更操作前に実行 | 変更操作後に実行 |
| 対象行の扱い | 更新対象の行(NEW)を書き換え可能 | 変更後の行をもとに他テーブル操作が可能 |
| 主な目的 | データ整形・値の補正(例:NULLなら現在日付を設定) | 履歴登録・ログ記録など副作用的処理 |
| 使用例 | 「適用開始日がNULLなら現在日付に更新」など | 「更新前の行を履歴テーブルに挿入」など |
| 特徴 | ・NEWを変更可能・コミット前に実行されるため高速・同一テーブル内での値補正向き | ・他テーブルへのINSERT/UPDATEが可能・コミット後処理的な使い方・トランザクション整合性確保が重要 |
| 試験での狙い | 値の整合性維持・自動補完 | 履歴管理・データ追跡の理解 |
| 注意点 | ・AFTERではNEWを変更できない・目的に応じた使い分けが重要 | ・BEFOREでは他テーブルを操作できない |

設問2

空欄(ア)
RPO(Recovery Point Objective;目標復旧時間)は、障害時にどの時点まで復旧させるかの目標値である。また、どの時点までのデータは失っても許容できるかという意味にもなる。
このRPOの決定要素は、データの量である。データの量により、失われることを許容できるか、許容できないかを判断する。よって、空欄(ア)はデータの量を表すログの量となる。
空欄(イ)


設問2(2)
問題文抜粋

〔パブリッククラウドが提供する主なサービスの仕様〕からレプリケーションの仕様を確認すると同期型と非同期型についての記載がある。


「非同期型では、複製先へのログの到達を待たずに、複製元のトランザクションがコミットされる」と記載がある。この仕様により、見積もりシステムへの影響を最小化することができる。同期型では、複製先でログをディスクに書き込んでいる時間分コミットが待たされる。一方、非同期型の場合、複製先でログをディスクに書き込んでいる時間分コミットが待たされることがない。
したがって、回答としては、『非同期型では、複製先のログの到達を待たないから』や『同期型では複製先でのログの出力を待つから』となる。
ポイント
ポイント
⬛︎同期型と非同期型の違い
・同期型;複製先でログをディスクに出力した後、複製元のトランザクションがコミット
→メリット;処理が確実に実施される
デメリット;複製先のログのディスク出力の時間分待つことになり、時間がかかる。
・非同期型l複製先へのログの到達を待たずに、複製元のトランザクションがコミット
→メリット;ログをディスクに書き込む待ち時間がなく、処理が早い
デメリット;複製先へログが到達されない(故障などで)と、データの不一致が起こる
同期型と非同期型の比較(まとめ)
| 特性 | 同期型レプリケーション | 非同期型レプリケーション |
| コミット処理 | 複製先でのログのディスク出力完了を待つ | 複製先へのログの到達を待たずにコミット |
| 応答速度 | ログ出力分遅延する | 最速で完了する |
| データ一貫性 | 高い(RPO: 0) | 低い(ログの未到達による不一致の可能性あり) |
| システム影響 | 複製先の負荷が直接影響し、遅延が発生しやすい | 複製先の負荷が影響しにくい(応答速度の最小化) |
設問2ー(3)

「非同期型では、複製先へのログの到達を待たずに、複製元のトランザクションがコミットされる」と記載がある。
非同期型では、先に複製元へのトランザクションがコミットされ、複製先へのログが到達しなかった場合、複製先(=参照専用インスタンス)では変更が失われている可能性がある。つまり、複製先へのログが到達しなかった原因を考えれば良い。
したがって、回答は次のようになる。
『複製元の変更操作が、複製先で未反映だった場合』
『複製元と複製先との通信が切断されていた場合』
『複製先のインスタンスが停止していた場合』
ポイント
非同期型;障害等により複製先で未反映が起こる可能性がある。
同期型;確実に複製先に反映され、データは一致する。
理解確認問題
① トリガー(BEFORE/AFTER)の理解確認
- タイミング
- Q1: BEFOREトリガーは更新操作の前/後のどちらに実行されますか?
- Q2: AFTERトリガーは更新操作の前/後のどちらに実行されますか?
- 操作対象
- Q3: BEFOREトリガーで変更可能なのはOLD/NEWのどちらですか?
- Q4: AFTERトリガーで変更可能なのはOLD/NEWのどちらですか?
- Q5: 他テーブルへのINSERTやUPDATEはBEFORE/AFTERのどちらで可能ですか?
- 目的・用途
- Q6: NULL値を現在日付に補正する処理はBEFORE/AFTERトリガーが適切ですか?
- Q7: 更新前の行を履歴テーブルに挿入する処理はBEFORE/AFTERトリガーが適切ですか?
② レプリケーション(同期/非同期)の理解確認
- タイミングと待機
- Q8: 同期型レプリケーションでは、複製先でのログ書き込み完了を待つ/待たない?
- Q9: 非同期型レプリケーションでは、複製先でのログ書き込み完了を待つ/待たない?
- メリット・デメリット
- Q10: 同期型のメリットは?デメリットは?
- Q11: 非同期型のメリットは?デメリットは?
- 業務適用の判断
- Q12: 見積もりシステムのような高速応答が必要な業務では、同期型/非同期型どちらが向いていますか?
- Q13: データの整合性を絶対に確保したい場合は、同期型/非同期型どちらが向いていますか?
設問2:トリガー(BEFORE/AFTER)
| No. | 質問 | 確認したい知識のポイント |
| Q1. | 適用開始日が$\text{NULL}$の場合に現在日付で上書きする処理は、$\text{BEFORE}トリガーと\text{AFTER}トリガーのどちらで実現しますか?また、その操作対象は\text{OLD}と\text{NEW}$のどちらの変数ですか? | **BEFOREトリガーの役割とNEW**変数の操作 |
| Q2. | 更新前の行のデータを履歴テーブルに挿入する処理は、$\text{BEFORE}トリガーと\text{AFTER}$トリガーのどちらで実現しますか?また、履歴テーブルに挿入する更新前の適用開始日を参照するために使う変数は何ですか? | **AFTERトリガーの役割とOLD**変数の参照 |
| Q3. | トリガー内で**$\text{NEW}変数の値∗∗を変更できるのは、\text{BEFORE}トリガーと\text{AFTER}$トリガーのどちらですか? | $\text{NEW}$変数の変更可否とトリガーの実行タイミング |
設問3:レプリケーション(同期/非同期)
| No. | 質問 | 確認したい知識のポイント |
| Q4. | 見積もりシステムのように応答速度が重視される場合、同期型と非同期型のどちらが適していますか?また、その最大の理由を簡潔に述べてください。 | 非同期型の利点と応答速度への影響 |
| Q5. | 同期型レプリケーションでは、複製元のトランザクションのコミットが何を待って実行されますか? | 同期型におけるコミットのブロック要因 |
| Q6. | 非同期型レプリケーションの最大のデメリットは何ですか?(データの一貫性の観点から説明してください。) | 非同期型におけるデータ不一致のリスク |
以上で令和4年午後1問2の解説を終了します。

