【问题标题】:Oracle SQL "connect by prior" for getting inherited permissions用于获取继承权限的 Oracle SQL “先连接”
【发布时间】:2021-09-03 06:35:30
【问题描述】:

我有如下数据:

file_id  |  file_name | user_group_id | group_permission | file_parent
1           abc              devs          read               NULL
1           abc              devs          write              NULL
2           def              NULL          NULL                1
3           jkl              NULL          NULL                2 
3           ghi              end_u         read                2

它位于一种层次结构树中,其中文件具有用户组和附加权限, 我拥有的数据并不总是附加用户组和权限,如果是这种情况,那么他们应该继承其父级的用户组和权限(有时它可能是超级父级,即父级的父级)。我想构建如下所示的输出,但我不能使用递归

file_id  |  file_name | user_group_id | group_permission | file_parent
    1           abc              devs          read               NULL
    1           abc              devs          write              NULL
    2           def              devs          read                1
    2           def              devs          write               1
    3           jkl              devs          read                2
    3           jkl              devs          write               2
    4           ghi              end_u         read                2

我试图寻找一个解决方案,似乎 Oracle 具有可以提供帮助的“先验连接”结构,但我对数据库开发还很陌生,不知道如何构建它。

我已经检查了这些页面,但我还无法想象解决方案:

【问题讨论】:

    标签: sql oracle oracle11g hierarchical


    【解决方案1】:

    你可以使用:

    SELECT file_id,
           file_name,
           CONNECT_BY_ROOT(user_group_id) AS user_group_id,
           CONNECT_BY_ROOT(group_permission) AS group_permission,
           file_parent
    FROM   table_name
    START WITH
           user_group_id    IS NOT NULL
    AND    group_permission IS NOT NULL
    CONNECT BY
           PRIOR file_id    = file_parent
    AND    user_group_id    IS NULL
    AND    group_permission IS NULL
    ORDER BY
           file_id,
           file_name,
           group_permission
    

    其中,对于您的示例数据:

    CREATE TABLE table_name ( file_id, file_name, user_group_id, group_permission, file_parent ) AS
    SELECT 1, 'abc', 'devs',  'read',  NULL FROM DUAL UNION ALL
    SELECT 1, 'abc', 'devs',  'write', NULL FROM DUAL UNION ALL
    SELECT 2, 'def', NULL,    NULL,    1 FROM DUAL UNION ALL
    SELECT 3, 'jkl', NULL,    NULL,    2 FROM DUAL UNION ALL
    SELECT 4, 'ghi', 'end_u', 'read',  2 FROM DUAL;
    

    输出:

    FILE_ID FILE_NAME USER_GROUP_ID GROUP_PERMISSION FILE_PARENT
    1 abc devs read
    1 abc devs write
    2 def devs read 1
    2 def devs write 1
    3 jkl devs read 2
    3 jkl devs write 2
    4 ghi end_u read 2

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-04
      • 2014-09-21
      相关资源
      最近更新 更多