有没有一种方法可以针对日志表使用规则来验证表?

时间:2019-11-05 11:38:46

标签: sql oracle

我是oracle的初学者,我想知道如何解决以下问题(我也想学习,因此希望对解决方案有所解释)。

我有两个表,一个包含规则,另一个包含日志。现在,我希望能够检查哪个规则用于日志中的条目。这样,我想检查所有规则是否仍然有效或应该更新。

第一张桌子:t_logon_log

username  os_user program terminal hostname ip_address logon_time
username1 user1   unknown unknown  server1  1.2.3.4    12-09-19
username1 user2   unknown unknown  server2  2.3.4.5    19-09-19
username1 user3   unknown unknown  server3  3.4.5.6    19-10-19

第二张表:t_allowed_connections

rule# username  os_user program hostname ip_address apply_rule
60    username1 user2   *       *        *          Yes
8     username1 *       *       *        *          Yes

现在,我创建了一个查询,该查询只是将日志表分组在一起,以便我可以手动对其进行查看。

select      Count(*), USERNAME, OS_USER, PROGRAM, TERMINAL, HOSTNAME, IP_ADDRESS
from        t_logon_log
where       LOGON_TIME > '01-01-19'
group by    USERNAME, OS_USER, PROGRAM, TERMINAL, HOSTNAME, IP_ADDRESS
order by    USERNAME;

但是我想创建一个查询,该查询提供的输出将为查询的每行返回我,在该行上方,rule#号对该行有效。

以此,我想将结果与规则进行比较,看看可以更严格地删除哪些规则。

2 个答案:

答案 0 :(得分:0)

我猜测'*'的意思是“匹配任何值”。否则规则需要匹配特定值。

因此,考虑通配符,您将使用join

select l.*,
       ac.rule_number
from t_logon_log l join
     t_allowed_connections ac
     on (ac.username = l.username or ac.username = '*') and
        (ac.os_user = l.os_user or ac.os_user = '*') and
        (ac.os_user = l.program or ac.program = '*') and
        (ac.os_user = l.hostname or ac.hostname = '*') and
        (ac.os_user = l.ip_address or ac.ip_address = '*') 
where ac.apply_rule = 'Yes';

答案 1 :(得分:0)

您可以使用join查找每个连接的匹配规则。

select  *
from    t_logon_log l
left join
        t_allowed_connections r
on      (r.username = '*' or r.username = l.username) and
        (r.os_user = '*' or r.os_user = l.os_user) and
        (r.program = '*' or r.program = l.program) and
        ...

left join对左表中的每一行重复左表中的每个匹配行。如果没有行匹配,则使用由null值组成的行。