我是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#号对该行有效。
以此,我想将结果与规则进行比较,看看可以更严格地删除哪些规则。
答案 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
值组成的行。