【发布时间】:2016-03-19 10:40:02
【问题描述】:
我的问题围绕着使用 Oracle 数据库来管理原始权利与业务友好角色之间的映射。
基本上,我有两张桌子:
映射表 - 这将包含适合特定应用程序角色所需的权利。请注意,您必须拥有特定应用程序角色的所有权利才能拥有它。此外,这可能会在任何一天发生变化,因此查询需要是动态的,因为它可能是 3 个权利 = 一个角色或 10 个权利 = 一个角色。
应用程序应用程序角色资源操作 -------------------------------------------------- ------ Test1 管理员 appserver1 管理员 Test1 管理员 appserver2 管理员 Test1 管理员 appserver3 管理员 test2 只读 appserver1 ro test2 只读 appserver2 ro帐户表 - 此表将包含来自服务器的原始数据,例如哪些帐户存在于哪些服务器上:
账户资源操作申请 ------------------------------------------------- abc123 appserver1 管理员 Test1 abc123 appserver2 管理员 Test1 abc123 appserver3 管理员 Test1 test2 只读 appserver1 ro我的目标是找到适用于我的帐户的应用程序角色(业务友好分组)。在此示例中,帐户 abc123 具有 3 个权利,分别用于应用服务器 1、2 和 3,并具有管理员权利。查看映射表,我现在可以说这个帐户具有应用程序角色“admin”。但是,账户 test2 仅在单个服务器上具有 ro,并且映射表明它需要在两台服务器上的 ro 才能具有“只读”角色,因此,帐户 test2 没有该角色。
对相同数据的查询输出应如下所示:
账户申请申请角色 ---------------------------------------------- abc123 Test1 管理员稍后,我还想要一个返回相反的查询;所有不适合某个角色的帐户。例如
帐户申请资源操作 ---------------------------------------------- test2 test2 只读 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
);
【问题讨论】:
-
我会尝试将主要的
WHERE子句条件移动到ON子句。 (即只需将 WHERE 关键字替换为 AND。)要获得真正的LEFT JOIN行为。
标签: sql database oracle oracle11g mapping