【ITニュース解説】Oracle 19c — Audit Only Top-Level SQL Statements

2025年09月07日に「Dev.to」が公開したITニュース「Oracle 19c — Audit Only Top-Level SQL Statements」について初心者にもわかりやすいように丁寧に解説しています。

作成日: 更新日:

ITニュース概要

Oracle 19cの新機能「トップレベルSQL監査」は、肥大化しやすい監査ログの量を削減する。ユーザーが直接実行したSQL文のみを記録し、プロシージャ内のSQLは対象外にするため、不要なログが減り、データベースのパフォーマンス維持やストレージ効率化に役立つ。

ITニュース解説

データベースを安全に、そして効率的に運用するために、「監査」は非常に重要な役割を担う機能だ。データベース監査とは、誰が、いつ、どのような操作をデータベースに対して行ったのかを記録する仕組みを指す。この記録(監査ログ)は、情報セキュリティの維持、不正アクセスの検知、コンプライアンス要件への対応、トラブルシューティングなど、多岐にわたる目的で活用される。特にシステムエンジニアにとって、データベースの健全性を保つ上で監査の知識は欠かせないものだ。

しかし、監査ログの記録量が膨大になると、いくつかの課題が生じる。データベースが日々大量の処理を行う中で、その全ての操作を詳細に記録しようとすると、生成されるログの量が莫大になりがちだ。これにより、まずストレージ容量が圧迫される問題がある。監査ログの保存には大量のディスクスペースが必要となり、ストレージコストの増加を招く。また、ログの書き込み処理自体がデータベースのパフォーマンスに影響を与えることも少なくない。ログの生成・書き込みはI/O処理を伴うため、システムの応答速度が低下したり、データベース全体の処理能力が落ちたりする可能性がある。さらに、蓄積された膨大なログの中から必要な情報を見つけ出す作業も、時間がかかり、効率が悪いという問題に直面する。こうした状況では、本当に重要な情報が埋もれてしまい、監査本来の目的達成が困難になる恐れがある。

このような課題を解決するため、Oracle Database 19cで導入された新機能が「Auditing Only Top-Level SQL Statements」だ。この機能は、データベースの監査設定をより賢く、より効率的に行うことを可能にする。具体的には、ユーザーが直接実行したSQL文のみを監査対象とし、それ以外の、例えばデータベース内部のプロシージャやファンクションの中で間接的に実行されるSQL文は監査の対象外とする仕組みである。

「トップレベルSQL文」とは、簡単に言えば、ユーザーが直接データベースに対して発行するコマンドのことだ。例えば、あなたがSQLクライアントから「SELECT * FROM EMPLOYEES;」と入力して実行した場合、これはトップレベルSQL文にあたる。一方、プロシージャとは、複数のSQL文や処理ロジックを一つにまとめたプログラムのようなもので、一度作成すれば何度でも呼び出して実行できる。プロシージャが実行されると、その内部に記述された複数のSQL文が順次実行されることになる。これらはユーザーが直接入力したものではなく、プロシージャの一部として実行されるため、「間接的なSQL文」と見なされる。

従来の監査設定では、ユーザーがプロシージャを実行した場合、そのプロシージャ自体の実行はもちろんのこと、プロシージャの内部で実行される個々のSQL文も全て詳細に監査ログとして記録されていた。しかし、「Auditing Only Top-Level SQL Statements」機能を利用することで、監査の範囲をユーザーが直接実行した「プロシージャを実行せよ」というトップレベルの命令だけに限定し、プロシージャ内部で繰り返し実行される個々のSQL文は記録しないように設定できるのだ。

この新機能の使い方は非常にシンプルだ。監査ポリシーを作成する際に、CREATE AUDIT POLICY文にONLY TOPLEVELというキーワードを追加するだけで良い。例えば、CREATE AUDIT POLICY TOPLEVEL_on ACTIONS ALL ONLY TOPLEVEL;のように記述する。このONLY TOPLEVEL句を追加するだけで、その監査ポリシーが適用されたユーザーのアクションは、トップレベルのSQL文のみが監査対象となる。どの監査ポリシーがこの機能を使用しているかは、AUDIT_UNIFIED_POLICIESというビューのAUDIT_ONLY_TOPLEVELという列を確認することで把握できる。

具体的な例でその効果を見てみよう。myproc1という名前のプロシージャがあるとする。このプロシージャは、mytblというテーブルにv$datafileの内容を挿入するINSERT文が10回繰り返されるという内容だ。つまり、このプロシージャを一度実行すると、内部では10回のINSERT文が実行されることになる。

まず、この新機能を使わない通常の監査ポリシーactions_all_polをユーザーusefに適用し、usefmyproc1プロシージャを実行したと仮定する。この場合、監査ログ(unified_audit_trailビュー)には合計で11件のレコードが記録される。内訳は、myproc1プロシージャの実行命令自体が1件、そしてプロシージャ内部で実行された10件のINSERT文がそれぞれ1件ずつ、合計で11件という結果だ。このように、プロシージャ内部の細かな操作まで全て記録されるため、実行されるSQL文の数に比例してログの量が増えていく。

次に、この新機能「Auditing Only Top-Level SQL Statements」を使った監査ポリシーTOPLEVEL_onusefユーザーに適用し、再びmyproc1プロシージャを実行してみる。すると、今度は監査ログに記録されるレコード数はわずか1件となる。この1件のレコードは、ユーザーusefが直接実行した「myproc1プロシージャを実行せよ」というトップレベルの命令、すなわちexec myproc1という文に対応するものだ。プロシージャ内部で実行された10件のINSERT文は、この監査ポリシーでは記録されない。

このように、この機能を利用することで、プロシージャやファンクションが頻繁に呼び出され、その内部で多数のSQL文が実行されるようなシステム環境において、監査ログの量を劇的に削減できる。監査ログの量が減れば、ストレージの節約になるだけでなく、監査ログの書き込みによるデータベースへの負荷を軽減し、システムのパフォーマンスを維持することにもつながる。また、本当に重要な「誰が、どのようなトップレベルの操作を開始したか」という情報に焦点を絞ってログを記録するため、監査ログの分析や管理もより効率的に行えるようになるだろう。

この機能は、セキュリティとパフォーマンスのバランスを取る上で非常に有効なツールだと言える。セキュリティを確保するためには詳細な監査が必要だが、過剰なログはシステム全体の運用効率を低下させる。Oracle 19cの「Auditing Only Top-Level SQL Statements」は、このジレンマを解消し、必要な監査情報を維持しつつ、データベース運用における負担を軽減するための強力な選択肢となるだろう。システムエンジニアとして、このような新機能を理解し、適切に活用することは、より堅牢で効率的なシステム構築・運用に不可欠なスキルとなる。

関連コンテンツ