0

Oracle データベースにこのビューがあり、SQL クエリを使用してレポートを生成しようとしていますが、ここ数日間機能していないため、専門家のアドバイスを受けることにしました。

ビューはうまく動作します。基本的にビューが行うことは、監査目的でデータベースにログインするすべてのユーザーを記録することです。

列を表示:

  • データベース名
  • ユーザー名
  • サーバ
  • プログラム
  • ログオン時間

質問:

  1. date=26-Dec-2012 に dbname=x にログインするすべてのユーザー名とプログラムでグループ化する SQL を生成しようとしています。

  2. ユーザーがログオンした個別のユーザー名とプログラムを数える 26-Dec-2012

基本的に取得しようとしています... dbname = xがusername = abcを介して50000ログインを取得した場合、abcはどのサーバーとどのプログラムから接続されましたか?

次のクエリを試しました

  select dbname, username, server, program, logon_time from audit 
    where username = abc and 
    dbname in (select dbname from audit
       where dbname='x' and logon_time = to_date('26-DEC-2012','DD-MON-YYY')) 
         group by username, program
4

2 に答える 2

0

次のようなことを試すことができます:

SELECT dbname, username, server, program, trunc(logon_time), count(*) FROM audit 
WHERE username = 'abc'
AND dbname = 'x' 
AND logon_time >= to_date('26-DEC-2012','DD-MON-YYY')
AND logon_time < to_date('27-DEC-2012','DD-MON-YYY')
GROUP BY dbname, username, server, program, trunc(logon_time)

編集:コンラッドが指摘したグループ化の間違いを修正するために回答が改訂されました。
何が必要かはまだ 100% わかりませんが、これはもっと近いはずです。

于 2012-12-27T20:20:10.393 に答える
0

これは、日付と時刻の情報を日付情報だけに再フォーマットする際の問題を除けば、非常に簡単に思えます。

クエリ 1:

SELECT username, program
  FROM Audit
 WHERE dbname = 'x'
   AND TO_CHAR(logon_time, 'YYYY-MM-DD') = '2012-12-26'
 GROUP BY username, program;

'x'これにより、 2012 年 12 月 26 日にデータベースにログインした個別のユーザー名とプログラムの組み合わせのリストが表示されます。

クエリ 2:

データベース名に関する基準を除いて、クエリ 1 からの行の COUNT が必要なので、次のようにします。

SELECT COUNT(*)
  FROM (SELECT username, program
          FROM Audit
         WHERE TO_CHAR(logon_time, 'YYYY-MM-DD') = '2012-12-26'
         GROUP BY username, program
       )

これにより、2012 年 12 月 26 日に任意のデータベースに接続された個別のユーザー名とプログラムの組み合わせの数がわかります。

于 2012-12-27T21:25:23.517 に答える