powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Необходимо реализовать представление с исключением некоторых записей.
9 сообщений из 9, страница 1 из 1
Необходимо реализовать представление с исключением некоторых записей.
    #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
Необходимо реализовать представление с исключением некоторых записей.
    #38842580
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЯНХНП
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Необходимо реализовать представление с исключением некоторых записей.
    #38842602
Dark Man
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to
Главное конструктивно :)
Вроде и так всё подробнее некуда расписал. Но всё же попробую более кратко изложить суть. Три набора данных, для учётных записей. Записи в них, для данного примера продублированы. Т.е. для каждой из учёток имеется 20139 записей о разрешении права чтения. Т.е. итого их уже 60417. Хочется прочитать так, чтобы чтений было только 20139 раз из таблицы прав на записи, ну и соответственно 20139 раз из той таблицы, для которой эти права и настроены. С одной оговоркой, всё это уложить в представление.
...
Рейтинг: 0 / 0
Необходимо реализовать представление с исключением некоторых записей.
    #38842609
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dark Man,

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

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

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


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