Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Audit Trigger for Tracking User Updates and Deletions in table

2025年09月18日に「Dev.to」が公開したITニュース「Audit Trigger for Tracking User Updates and Deletions in table」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

データベースでユーザーによるデータの更新や削除を自動で記録する「監査トリガー」の仕組みを解説する。テーブルへの変更があった際、その変更前のデータを別の監査テーブルに保存する。これにより、誰がいつデータを操作したかの履歴を保持し、データの追跡可能性と信頼性を高める。

ITニュース解説

この解説は、データベースにおける重要な機能の一つである「トリガー」を使って、システム内のデータの変更履歴を追跡・記録する方法について説明する。具体的には、ユーザー情報を管理するテーブルでデータが更新されたり削除されたりした際に、その変更内容を漏れなく記録し、後から誰が、いつ、何を、どのように変更したかを調べられるようにする仕組みについて学ぶ。

トリガーとは、データベースで特定のイベント(例えば、データの挿入、更新、削除など)が発生したときに、自動的に実行されるプログラムのことである。人間が手動で操作するのではなく、データベース自身が決められたルールに従って動作するため、処理の自動化と確実な実行を保証する。

今回紹介するトリガーは、GEN_MST_USR_LSTという名前のテーブルが対象である。このテーブルはシステムに登録されているユーザーのマスターデータ、つまりユーザーID、氏名、パスワード、役職などの基本的な情報を管理している重要な場所である。このテーブルのデータが更新されるか、あるいは削除されるたびに、トリガーが自動的に起動し、その変更の記録を残す役割を担っている。

このトリガーの名前はAUD_ULT_AR_UDと名付けられている。設定としては「AFTER DELETE OR UPDATE ON GEN_MST_USR_LST FOR EACH ROW」とある。これは、「GEN_MST_USR_LSTテーブルに対してデータが削除または更新された『後』に、変更された『行ごと』にこのトリガーを実行する」という意味である。つまり、もし一度の操作で複数のユーザーデータが更新された場合でも、その変更されたデータ一つ一つに対して監査の処理が走るということである。

ただし、すべての操作が監査されるわけではない。もし操作を行ったユーザーがPRG_USERというシステム用のユーザーだった場合、このトリガーは処理を実行しない。これは、システム内部の自動処理などが大量に発生した際に、監査ログが不要に膨大になるのを避けるための工夫であり、本当に人間が行った操作だけを追跡したい場合に有効な設定である。

トリガーが実行されると、まずgen_pkg.get_user_contextという特別なプログラム(プロシージャと呼ぶ)を呼び出す。このプロシージャは、現在データベースにアクセスしているユーザーのID、役割、操作を行っているホストコンピューター、そして現在のトランザクション(一連のデータベース操作)に関する詳細な情報などを取得する。これは、誰が、どこから、どのような文脈で操作を行ったのかを特定するために不可欠な情報である。

取得した情報の中に、まだ現在の操作に対応するトランザクション詳細ID(v_dtl_id)が存在しない場合がある。そのような場合、dtl_seq.NEXTVALという機能を使って、新しい一意のIDを生成する。このIDは、データベースのシーケンスという、連続したユニークな番号を自動生成する仕組みから取得される。そして、この新しいトランザクション詳細IDと、先ほど取得したユーザー情報、ホスト情報、モジュール情報などを合わせて、GEN_DB_TRANSACTION_LOGという専用のログテーブルに記録する。これにより、一つの大きな操作(トランザクション)がいつ、誰によって開始されたかという記録が残る。

ここまでで、操作を行ったユーザーとトランザクションの詳細が記録された。次に、実際にデータが変更される前の状態を監査テーブルに記録する。これは、変更前と変更後の状態を比較したり、万が一データが誤って変更された場合に元の状態に戻したりするために非常に重要である。

もし実行されたのがデータの『削除』操作だった場合、トリガーはGEN_MST_USR_LSTテーブルから削除されようとしているその行の、変更される前のデータ(:OLDと呼ばれる)を丸ごと取得する。そして、その古いデータをGEN_MST_USR_LST_AUDという監査用のテーブルに挿入する。この時、記録されるデータには「ACTION」という列があり、ここには「D」(DeleteのD)という文字が書き込まれ、さらに先ほど生成した新しいトランザクション詳細IDも一緒に記録される。

もし実行されたのがデータの『更新』操作だった場合も同様に、トリガーはGEN_MST_USR_LSTテーブルで更新されようとしている行の、変更される前のデータ(やはり:OLDとしてアクセスされる)を全て取得する。そして、その古いデータをGEN_MST_USR_LST_AUDテーブルに挿入する。この場合の「ACTION」列には「U」(UpdateのU)という文字が書き込まれ、これもまた新しいトランザクション詳細IDと共に記録される。

GEN_MST_USR_LST_AUDテーブルは、元のGEN_MST_USR_LSTテーブルとほぼ同じ構造をしているが、さらに『ACTION』(操作の種類)と『NEW_DTL_ID』(トランザクション詳細ID)という列が追加されている。これにより、どのユーザーが、いつ、どの行に対して、削除したのか更新したのか、そしてその操作の前後でデータがどう変化したのかを、後からいつでも詳しく調べることが可能になる。これは、システムのセキュリティ監査、コンプライアンス要件の遵守、または問題発生時の原因究明(トレーサビリティ)において極めて重要な役割を果たす。

このように、データベーストリガーを適切に利用することで、システムの重要なデータに対するあらゆる変更を自動的かつ確実に記録し、その履歴を保持することができる。システムエンジニアを目指す上では、このようなデータの完全性、追跡可能性、そしてセキュリティを確保するための仕組みを理解し、設計・実装できる能力が非常に重要となる。

関連コンテンツ