|
|
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
Приветствую всех. Казалось бы, задача тривиальная, но решения в моей голове не родилось. Поскольку никаких идей более не осталось, обращаюсь за помощью. Может статься так что я задам тупой вопрос, ну чтож поделать. Есть конкретная задача - написать представление (обсуждать прошу только этот вариант) в котором бы производилось чтение данных из одной таблицы тех записей, список которых определяется в другой таблице из ниже описанной структуры. Итак. Есть структура из таблиц: 1 - справочник учётных записей(роли и пользователи); 2 - справочник связи многие-ко-многим между ролями и пользователями; 3 - множество прочих таблиц-справочников; 4 - таблица "общих" прав на таблицы-справочники (право чтения/изменения/прочих прав) для учётных записей; 5 - таблица прав на записи таблиц, в которой хранятся права на какие-либо конкретные записи; Итак описание ситуации: 1 - У учётной записи пользователя есть две роли 2 - для каждой из учётных есть разрешённые к чтению записи(некоторые дублируются в ролях пользователя, некоторые запрещены/разрешены только пользователю, некоторые запрещены/разрешены ролям), а общее право чтения из таблицы запрещено Задача: Прочитать из какой-либо таблицы весь набор данных(20139 записей) который явно к чтению разрешен. Но со следующей схемой, если запись уже запрещена к чтению пользователю, то проверять права на чтение для его ролей этой записи не нужно. И в итоге читать те записи, которые попали в список разрешённых к чтению. Но сон разума рождает только чудовищ вида - П..Ц полный и образа подобного: Код: sql 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. что в случае, когда общее право на таблицу чтение из неё запрещает, a всем учётным записям(пользователю и его ролям включительно) разрешено чтение 99,9% записей приводит к тому, что количество чтений возрастает до 1,6 миллиардов(ну да, логично) и времени чтения данных что-то около получаса. Господа, я правда идиот?! Или же есть решение, в виде грамотно написанного запроса, но мною сей дзен не познан?! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2014, 11:45 |
|
||
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
ЯНХНП Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2014, 11:56 |
|
||
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
to Главное конструктивно :) Вроде и так всё подробнее некуда расписал. Но всё же попробую более кратко изложить суть. Три набора данных, для учётных записей. Записи в них, для данного примера продублированы. Т.е. для каждой из учёток имеется 20139 записей о разрешении права чтения. Т.е. итого их уже 60417. Хочется прочитать так, чтобы чтений было только 20139 раз из таблицы прав на записи, ну и соответственно 20139 раз из той таблицы, для которой эти права и настроены. С одной оговоркой, всё это уложить в представление. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2014, 12:06 |
|
||
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
Dark Man, с такой структурой у тебя конкретные проблемы будут ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2014, 12:09 |
|
||
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
мне видится так в каждой таблице где нужно ограничение пишется в отдельное поле пользователь создавший запись. Пользователи включаются в некоторые группы. Доступ получают те пользователи которые входят в одну группу с тем кто создал запись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2014, 12:11 |
|
||
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
Dark ManГоспода, я правда идиот? Да, правда. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2014, 12:11 |
|
||
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
Симонов Денис, Это понятно. Но задача была поставлена так: Если пользователю что-то явно разрешено/запрещено, то права роли не смотрим. Если явно не сказано, то берем от роли, с приоритетом разрешающего права. Но реальность упорная штука. И вроде всё логично получается при описанных условиях, но хочется верить что это я идиот, а не решения нет :) А получается или нужен инструментарий, который будет готовить права НА ВЕСЬ набор данных, при изменении в ролях/пользователях или менять схему. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2014, 12:15 |
|
||
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
Dark Man, напиши функцию проверки прав доступа для пользователя. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2014, 08:16 |
|
||
|
Необходимо реализовать представление с исключением некоторых записей.
|
|||
|---|---|---|---|
|
#18+
интересно, как поведет себя coalesce( select право пользователя from ... , select право роли from ... , select право еще более высокой абстракции from ... , false) Будет ли она все запросы сразу дергать или только по мере необходимости? И что значит "дяля его ролей" ? вроде назначенная роль может быть только одна в любом текущем соединении, остальные пассивны. Если же роли - это типа групп, то что делать в ситуации, когад на одной группе стоит запрет, а на другой - разрешение ? В принципе в Windows и у пользоватля и у групп и у черт еще знает чего есть SID - Security ID. И права назначаются уже SID'у - ( SID, ObjectID, True/False ). Ну или не назначаются. И тогда уже общая идея - развернуть пользователя ( with recursive или GTT или ещё как-то ) в "полу-сортированный" список SIDов (личный, сиды ролей/групп, сиды ролей ролей и т.д.) и по этому списку взять first(1) запись с нужным Object ID ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 30.12.2014, 12:10 |
|
||
|
|

start [/forum/topic.php?fid=40&fpage=83&tid=1563116]: |
0ms |
get settings: |
10ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
74ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
35ms |
get tp. blocked users: |
1ms |
| others: | 248ms |
| total: | 396ms |

| 0 / 0 |
