【问题标题】:Select rows from one table where mapping exists in another table从一个表中选择另一表中存在映射的行
【发布时间】: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


【解决方案1】:

试试这个:

;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;

【讨论】:

  • 我今天会试一试,但我觉得我会遇到昨天遇到的问题,即如果帐户具有映射表中定义的其他资源/映射,即使用户仍然拥有其中一个角色,它没有返回,因为我们正在加入计数。
  • @sarveet I "invalid table name" for this line: WITH userdata AS ( SELECT account. 这是为什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多