C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как бы по-взрослому сделать...
Deem
Отправлено: 23.07.2004, 09:34


Мастер участка

Группа: Участник
Сообщений: 327



Тут такая проблема вдруг встала:
В той самой складской программе у меня будет выписка накладных приходных, расходных, внутренних, возврата.
В их заголовки и детали входит правктически одна и та же по структуре информация. Я обрадовался, и решил все накладные запихать в две таблицы с указанием типа в заголовках. А потом меня пробило: при реализации разделения прав доступа стандартно с помощью ролей (FireBird 1.5) лица, получившие право изменять приходные накладные также могут изменять и расходные, и вобще все.
Теперь думаю, что делать? Либо хранить разные накладные в разных таблицах, либо изобретать велик для разграничения прав на уровне одной таблицы.
Можно закрыть доступ к таблице совсем, и сделать VIEW для каждого вида накладной. Это, простой способ. Можно UDF написать для контроля прав в одной таблице (но это не хочется). Или все же несколько таблиц?
Как будет "более по-взрослому" ? Переделывать пока все равно нечего. wink.gif
Nick
Отправлено: 23.07.2004, 09:49


Машинист паровоза

Группа: Участник
Сообщений: 247



сделал в одной таблице заголовок в другой данные,
узеры и права в другой таблице,
ограничения тоступа в программе.

во первых когда делал не знал о крутых возможностях самого сервера,
во вторых Users как и другие справочники реплицируются в филиалы и нет необходимости при изменении справочника пользоватей летать по филиалам и раздавать им новые права.

в новом проекте свяжу права со справочником "Персонал"
т.к. при увольнении User а появились некоторые проблемы.
AVC
Отправлено: 23.07.2004, 10:18


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

Можно закрыть доступ к таблице совсем, и сделать VIEW для каждого вида накладной. Это, простой способ. Можно UDF написать для контроля прав в одной таблице (но это не хочется). Или все же несколько таблиц?

Вы сами написали пути решения. Выбор варианта зачастую зависит от возможностей сервера. Если FireBird позволяет, то решение с View предпочтительнее (это стандартное решение).
То есть:
1. Создаем закрытые таблицы залоловков и содержимого (ни у кого нет прав).
2. Создаем View'ы с дискриминацией по типу документа.
3. Создаем роли, имеющие разрешения на View'ы.
4. Назначаем пользователям роли.

Решение через SP то же имеет право на жизнь. Мне встречалась система, где весь доступ шел только через SP. Но по моему мнению с этим способом больше мороки при необходимости модификации БД.

Несколько таблиц применяется если есть проблемы с работой через View. Например в ASA6. А в остальном он ни чем не отличается от первого варианта.
olegenty
Отправлено: 23.07.2004, 15:05


Ветеран

Группа: Модератор
Сообщений: 2412



я бы сделал так: на SELECT — VIEW, на INSERT/UPDATE/DELETE — SP. тем более, что FIBPlus все запросы хранит в одном компоненте. Удобно, блин.
Deem
Отправлено: 26.07.2004, 13:08


Мастер участка

Группа: Участник
Сообщений: 327



Все это хорошо, если бы не одна фигня: представление в одной таблице всех накладных еще и тем привлекло, что интерфейс работы с ними — общий. А если я растяну их по VIEW, каждый из которых мона или нельзя смотреть, как все накладные показать (или не все smile.gif) в одной сетке? Объединять результаты запросов из нескольких вьюшек, причем выборочно, из каких. Тоже — морока.
Или придется отображать в один момент времени только накладные одного типа, причем выбор этого типа будет зависеть от прав юзера?
Вот, думаю... wink.gif
AVC
Отправлено: 26.07.2004, 13:40


Ветеран

Группа: Модератор
Сообщений: 1583



А как вы хотите: что бы права ограничивались через ваше приложение или что бы пользоватедь не мог видеть неположенную информацию через любое приложение ?
olegenty
Отправлено: 27.07.2004, 06:49


Ветеран

Группа: Модератор
Сообщений: 2412



другой вариант — ХП, где по USER определяется WHERE. это очень несложно сделать, понадобится только табличка, где USER (или ROLE) будет ставиться в соответствие перечень типов накладных. но есть минус — если накладных в запросе много, то тогмоза будут хуже, чем при вьюхе или прямом селекте...
Deem
Отправлено: 27.07.2004, 09:44


Мастер участка

Группа: Участник
Сообщений: 327



to AVC
Разграничение прав пользователя идет через роли и сервак, т.к. возможен, в любом случае, доступ к базе из другого приложения или какого-нибудь Expert или Console. Ту иного подхода быть не может.

А в приложении идет тест на возможность выполнения пользователем определенных действий, и и если — запрет, то программа не выполняет подобные запросы.

А для разграничения прав на уровне сервака без разных вьюх не обойтись. При выводе данных из нескольких аналогичных VIEW можно результат объединять по UNION :

select * from RASHOD_VIEW
union
select * from PRIHOD_VIEW

Да, я так и сделаю. И после определения прав пользователя составлять этот запрос. Тогда каждый увидит только то, что можно.
AVC
Отправлено: 27.07.2004, 10:10


Ветеран

Группа: Модератор
Сообщений: 1583



Если FB позволяет, то вместо Union в данном случае выгоднее писать Union all.
Если дискриминационный признак имеет только два состояния выгоднее сделать три View или "кому доступно все" работать через базовую таблицу — Union довольно медленный оператор.
Deem
Отправлено: 27.07.2004, 11:50


Мастер участка

Группа: Участник
Сообщений: 327



To AVС
Не, не два. Это я для примера. А JOIN ALL мне на что? Это чтоб без проверки повторов записей (знаю, что если повторы есть, то обрезаются). У меня каждая накладная имеет совсем свой ID, так что повторов нет. Просто быстрее будет работать?
Просветите. smile.gif

Отредактировано Deem — 27/07/2004, 12:53
Deem
Отправлено: 27.07.2004, 11:56


Мастер участка

Группа: Участник
Сообщений: 327



Да, UNION ALL есть, и штука хорошая. smile.gif Т.е. как я и предполагал, он работает быстрее UNION, который ищет повторяющиеся записи. А если их точно нет, то и проверять незачем. smile.gif

Вернуться в Работа с базами данных в C++Builder