我的问题围绕使用Oracle数据库来管理原始权利与商业友好角色之间的映射。
基本上,我有两张桌子:
映射表 - 这将包含适合特定应用程序所需的权利。请注意,您必须具有特定应用程序的所有权利才能拥有它。此外,这可能会在任何一天发生变化,因此查询需要是动态的,因为它可能是3个权利=一个角色或10个权利=一个角色。
Application ApplicationRole Resource Action -------------------------------------------------------- Test1 Admin appserver1 admin Test1 Admin appserver2 admin Test1 Admin appserver3 admin test2 ReadOnly appserver1 ro test2 ReadOnly appserver2 ro
帐户表 - 此表将包含来自服务器的原始数据,例如哪些服务器上存在哪些帐户:
Account Resource Action Application ------------------------------------------------- abc123 appserver1 admin Test1 abc123 appserver2 admin Test1 abc123 appserver3 admin Test1 test2 ReadOnly appserver1 ro
我的目标是找到适用于我的帐户的approro(业务友好分组)。在此示例中,帐户abc123有3个权利,适用于应用程序服务器1,2和3,并具有管理员权限。看一下映射表,我现在可以说这个帐户有applicationrole" admin"。但是,帐户test2只在单个服务器上运行,并且映射表明它需要在两个服务器上运行才能拥有角色" ReadOnly"因此,帐户test2没有角色。
查询对此相同数据的输出应如下所示:
Account Application ApplicationRole ---------------------------------------------- abc123 Test1 Admin
稍后,我还想要一个返回相反的查询;所有不适合角色的帐户。 E.g。
Account Application Resource Action ---------------------------------------------- test2 test2 ReadOnly appserver1
如果我能提供更多信息,请告诉我!我无法在网上找到自己的东西,似乎很难找到。
谢谢你们! :)
修改 我设法编写了这个查询,它似乎适用于第一部分;不确定它是不是最好的方式,任何指导都会很棒:)
SELECT *
FROM TEMP_USERDATA b
LEFT JOIN TEMP_MAPPINGTABLE a
ON a.application = b.application
AND a.oresource =b.oresource
AND a.action =b.action
WHERE (SELECT COUNT(c.application||c.oresource||c.action)
FROM temp_mappingtable c
WHERE c.application=a.application) =
(SELECT COUNT(DISTINCT application||oresource||action||account)
FROM temp_userdata
WHERE temp_userdata.application=a.application
);
答案 0 :(得分:0)
试试这个:
;WITH mapingdata AS ( SELECT application,
applicationrole,
resource,
action,
COUNT ( * ) AS rowcount
FROM temp_mappingtable
GROUP BY application,
applicationrole,
resource,
action),
WITH userdata AS ( SELECT account,
resource,
action,
application,
COUNT ( * ) AS rowcount
FROM user_data
GROUP BY account,
resource,
action,
application)
SELECT *
FROM mapingdata m, userdata u
WHERE m.application = u.application
AND m.resource = u.resource
AND m.action = u.action
AND m.rowcount = u.rowcount;