0

我在 Oracle 数据库中有这个视图,我正在尝试使用 SQL 查询生成报告,但最近几天它无法正常工作,因此决定寻求专家建议。

View 运行良好。基本上,视图的作用是记录所有登录到任何数据库以进行审计的用户。

查看栏目:

  • 数据库名称
  • 用户名
  • 服务器
  • 程序
  • 登录时间

问题:

  1. 我正在尝试生成 SQL 以按日期为 2012 年 12 月 26 日登录到 dbname=x 的所有用户名和程序进行分组

  2. 计算用户在 2012 年 12 月 26 日登录的不同用户名和程序

基本上试图获取...如果 dbname=x 通过用户名=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

这似乎很简单,除了将日期+时间信息重新格式化为日期信息的问题。

查询一:

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 中的行数,因此:

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 回答