|
Помогите распутать иерархию
|
|||
---|---|---|---|
#18+
Есть не очень удобная иерархическая схема, с которой я весь день не могу разобраться. Есть справочник пользователей, в котором указываются пользователи системы. В этом же справочнике указываются и пользовательские роли, для которых задается специальное флаговое поле. Есть таблица принадлежности пользователей к ролям, которая строится не сверху-вниз (id - parent_id), а снизу-вниз (id - child_id). В этой таблице указываются связи "пользователь-роль" и "роль-роль" (роли могут быть вложенными). Мне нужно для каждого пользователя и роли построить дерево и получить идентификаторы корневой и последней роли. Макет с данными примерно такой: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
А нужная мне структура выглядит примерно так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37.
Но дальше не могу сообразить, как мне построить дерево, чтобы во-первых оно могло начинаться с пользователя или роли, а во-вторых чтобы в нем были и те роли, которые никому не назначены. Сделал так: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
Но здесь не решен п.2 и нет уверенности, что п.1 корректен. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 20:01 |
|
Помогите распутать иерархию
|
|||
---|---|---|---|
#18+
Если же говорить о задаче в целом, то есть еще таблица прав доступа, привязанная к user_id. Права могут быть привязаны как непосредственно к пользователю, так и к роли (причем на любом уровне вложенности). Мне нужно удобно определить: 1. Какие права дает конкретная роль (или роли). 2. Какие пользователи или роли имеют доступ к конкретному праву (хоть непосредственно, хоть косвенно). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 20:11 |
|
Помогите распутать иерархию
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
... |
|||
:
Нравится:
Не нравится:
|
|||
19.02.2021, 22:19 |
|
Помогите распутать иерархию
|
|||
---|---|---|---|
#18+
Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96.
SY. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2021, 01:38 |
|
Помогите распутать иерархию
|
|||
---|---|---|---|
#18+
О, большое спасибо. Вчера весь день голову ломал. В принципе я сообразил, что нужно "перевернуть" иерархию в id - parent_id и добавить корневые элементы, но не придумал, как это сделать, чтобы не добавлять элементы, для которых уже есть корень. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2021, 08:37 |
|
Помогите распутать иерархию
|
|||
---|---|---|---|
#18+
Адаптирую реальный запрос. Выполняю в SQL*Plus такой фрагмент: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Все хорошо, получаю список пользователей/ролей с назначенными ролями. Но как только раскомментирую строки, относящиеся к иерархии, получаю ошибку: Код: plaintext 1. 2.
... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2021, 14:11 |
|
Помогите распутать иерархию
|
|||
---|---|---|---|
#18+
А если вложенный запрос перенести в with — выполняется успешно. Это баг? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.02.2021, 14:24 |
|
|
start [/forum/topic.php?fid=52&msg=40047390&tid=1880419]: |
0ms |
get settings: |
8ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
23ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 117ms |
0 / 0 |