Oracle SQL "connect by prior" 获取继承权限

Oracle SQL "connect by prior" for getting inherited permissions

我有这样的数据:

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 具有可以提供帮助的“先验连接”结构,但我对数据库开发还很陌生,不知道如何构建它。

我已经检查了这些页面,但我还不能想出解决方案:

您可以使用:

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<>fiddle here