Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Необходимо реализовать представление с исключением некоторых записей. / 9 сообщений из 9, страница 1 из 1
25.12.2014, 11:45
    #38842558
Dark Man
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
Приветствую всех.

Казалось бы, задача тривиальная, но решения в моей голове не родилось. Поскольку никаких идей более не осталось, обращаюсь за помощью. Может статься так что я задам тупой вопрос, ну чтож поделать.

Есть конкретная задача - написать представление (обсуждать прошу только этот вариант) в котором бы производилось чтение данных из одной таблицы тех записей, список которых определяется в другой таблице из ниже описанной структуры.

Итак. Есть структура из таблиц:
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.
select GGT.ID, GGT.IMEI, GGT.NAME
from GPS_GL_TRACKER GGT
where exists(select 1
             from GIT_RGHT_RIGHT_GET(242)
             where RGHT = 0) and
      GGT.ID not in (select GRR_U.ID_RECORD
                     from GIT_RGHT_GL_ACCNT GRGA
                     inner join GIT_RGHT_REC GRR_U on GRR_U.ID_TABLE = 242 and
                           GRR_U.ID_ACCOUNT = GRGA.ID and
                           GRR_U.RIGHT_SEL = 1
                     where GRGA.SYS_NAME = current_user and
                           GRGA.ID_ACCOUNT_TYPE = 2
                     union
                     select GRR_R.ID_RECORD
                     from GIT_RGHT_GL_ACCNT GRGA
                     inner join GIT_RGHT_LNK_ACCNT GRLA on GRLA.ID_CHILD = GRGA.ID
                     inner join GIT_RGHT_REC GRR_R on GRR_R.ID_TABLE = 242 and
                           GRR_R.ID_ACCOUNT = GRLA.ID_PARENT and
                           GRR_R.RIGHT_SEL = 1
                     where GRGA.SYS_NAME = current_user and
                           GRGA.ID_ACCOUNT_TYPE = 2 and
                           not exists(select 1
                                      from GIT_RGHT_REC
                                      where ID_TABLE = 242 and
                                            ID_ACCOUNT = GRGA.ID and
                                            ID_RECORD = GRR_R.ID_RECORD and
                                            RIGHT_SEL = 1)) and
      GGT.ID > 0
order by GGT.ID


что в случае, когда общее право на таблицу чтение из неё запрещает, a всем учётным записям(пользователю и его ролям включительно) разрешено чтение 99,9% записей приводит к тому, что количество чтений возрастает до 1,6 миллиардов(ну да, логично) и времени чтения данных что-то около получаса.

Господа, я правда идиот?! Или же есть решение, в виде грамотно написанного запроса, но мною сей дзен не познан?!
...
Рейтинг: 0 / 0
25.12.2014, 11:56
    #38842580
Мимопроходящий
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
ЯНХНП
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.12.2014, 12:06
    #38842602
Dark Man
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
to
Главное конструктивно :)
Вроде и так всё подробнее некуда расписал. Но всё же попробую более кратко изложить суть. Три набора данных, для учётных записей. Записи в них, для данного примера продублированы. Т.е. для каждой из учёток имеется 20139 записей о разрешении права чтения. Т.е. итого их уже 60417. Хочется прочитать так, чтобы чтений было только 20139 раз из таблицы прав на записи, ну и соответственно 20139 раз из той таблицы, для которой эти права и настроены. С одной оговоркой, всё это уложить в представление.
...
Рейтинг: 0 / 0
25.12.2014, 12:09
    #38842609
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
Dark Man,

с такой структурой у тебя конкретные проблемы будут
...
Рейтинг: 0 / 0
25.12.2014, 12:11
    #38842616
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
мне видится так в каждой таблице где нужно ограничение пишется в отдельное поле пользователь создавший запись. Пользователи включаются в некоторые группы. Доступ получают те пользователи которые входят в одну группу с тем кто создал запись.
...
Рейтинг: 0 / 0
25.12.2014, 12:11
    #38842618
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
Dark ManГоспода, я правда идиот?
Да, правда.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25.12.2014, 12:15
    #38842625
Dark Man
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
Симонов Денис,

Это понятно. Но задача была поставлена так: Если пользователю что-то явно разрешено/запрещено, то права роли не смотрим. Если явно не сказано, то берем от роли, с приоритетом разрешающего права. Но реальность упорная штука. И вроде всё логично получается при описанных условиях, но хочется верить что это я идиот, а не решения нет :)
А получается или нужен инструментарий, который будет готовить права НА ВЕСЬ набор данных, при изменении в ролях/пользователях или менять схему.
...
Рейтинг: 0 / 0
30.12.2014, 08:16
    #38846207
roadster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
Dark Man,

напиши функцию проверки прав доступа для пользователя.
...
Рейтинг: 0 / 0
30.12.2014, 12:10
    #38846383
Arioch
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Необходимо реализовать представление с исключением некоторых записей.
интересно, как поведет себя

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
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Необходимо реализовать представление с исключением некоторых записей. / 9 сообщений из 9, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]