データベース クエリー ロギングは、ALLユーザーにルール存在していても個々のユーザーにBEGIN QUERY LOGGINGリクエストの実行を許可する階層的な基盤によって動作します。ただし、特定のアカウントとユーザーのペアにルールが存在する場合は、そのアカウントとユーザーのペアに新しいルールを発効する前に、適切なEND QUERY LOGGINGリクエストを実行してルールを削除する必要があります。
データベースでは、次に示す順序でルールを適用します。
階層内での順序 | ルールのタイプ |
---|---|
1 | アプリケーション名に基づくルール。 |
2 | 特定のユーザーと特定のアカウントに対するルール。 |
3 | 特定のユーザーと任意のアカウントに対するルール。 |
4 | すべてのユーザーと特定のアカウントに対するルール。 |
5 | すべてのユーザーと任意のアカウントに対するルール。 |
上記の表に示したように、DBQLは最初にアプリケーション名に基づくルールを検索します。そのようなルールが存在しない場合、DBQLはユーザーおよびアカウントに特定のルールを検索します。そのルールも存在しない場合は、階層を下って同様に検索します。SHOW QUERY LOGGINGリクエストを実行することで、データベースがどのルールを適用するかを判断できます。SHOW QUERY LOGGINGを参照してください。
ルール キャッシュには、アプリケーションのルールか、特定のアカウントとユーザーの組合わせのルールのどちらかが含まれます。ユーザーがログオンするたびに、最初にDBQLは階層順にルール キャッシュからルールを検索します。レベル1またはレベル2のルール キャッシュに特定のルールがない場合、DBQLは階層順にDBC.DBQLRuleTblから最適なものを検索します。DBQLは、ルール キャッシュにエントリを作成します。このエントリの形式は、アカウントとユーザーのペアに続けて、 そのアカウントとユーザーに対してDBQLを有効にしないルール、またはオプションと共に適用するDBQLルールのどちらかを追加したものになります。ルール テーブルのレベル1で一致があれば、DBQLはルール キャッシュにアプリケーション名のエントリを作成します。
階層的なスキーマにより、特定のアカウントとユーザーのペアにDBQLルールを呼び出し、その特定のユーザーの他のすべてのアカウントに別のルールを呼び出すことができるようになります。同様に、特定のアカウントのすべてのユーザーに対するルールを確立することも、その他のすべてのユーザーに別のルールを確立することもできます(ALLユーザーALLアカウントのルールなど)。
例えば、ALLユーザーのデフォルトのロギングにBEGIN QUERY LOGGINGリクエストを実行し、user1とオブジェクトおよびステップに対してDBQLも有効にすることができます。user1がログオンすると、DBQLはオブジェクトおよびステップを収集します。user1以外のユーザーがログオンすると、DBQLはそのユーザーのデフォルト情報のみをログに記録します。
同様に、オブジェクトの情報をログに記録するためのALLユーザーのルールが存在する場合、特定ユーザに対するルールを実装してDBQLがそのユーザーのデフォルトのロギングをログに記録するようにできます。
また、WITH NONEオプションを使用すると、ユーザーやアプリケーションなどを選択的にロギングから除外することもできます。例えば、ALLユーザーのデフォルトのロギングを指定するルールがあるが、busy_user1のロギングは除外したい場合、次のリクエストを発行します。
BEGIN QUERY LOGGING WITH NONE ON busy_user1;
一連のクエリー ロギング ルールが作成されると、そのルールは現在のセッションと、アクティブなDBQLルールが適用される後続のすべてのセッションに適用されます。
DBQLでは、5つのクエリー ロギング ルールのタイプの1つに含まれる名前付きインスタンスに対する複数のルールは許容されていません。たとえば、現時点で特定のアカウント名に属するALLユーザーにルールが存在していると、システムは重複するルールを受け入れません。