Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Всем привет! Бьюсь над задачей разграничения доступа к данным с помощью SectionAccess. Задача состоит в том, чтобы некоторые группы пользователей (продажи) видели только клиентов своего филиала (это понятно, как сделать), а остальные пользователи должны видеть все данные. Прописываю для сотрудников из продаж в скрипте в разделе SectionAccess:
select UPPER(U.sAMAccountName) AS NTNAME ,
U.filialName AS [Филиал Клиента] from ....
В результате они видят данные, ассоциированные с клиентами своего филиала.
Вопрос в том, как сделать так, чтобы остальным пользователям (не продажам) было видно абсолютно все данные?
Для них никакого разграничения применяться не должно. Если я пишу для них в скрипте
SELECT UPPER(U.sAMAccountName) AS NTNAME ,
'*' AS [Филиал Клиента] from ...
то это отсеивает ту часть данных,у которых нет клиентов. Таким образом, пользователи не увидят те данные, для которых нет записей в табличке с полем "Филиал Клиента". Как эту проблему решить? Надеюсь, понятно описала 😃
Ну конечно, в моём случае это только пример. Подбивать под реальные условия нужно на месте.
К сожалению качество данных как правило оставляет желать лучшего. Когда на пример у клиента нет номера, ему дают какой-нибудь dummy номер 99999, этот номер присоединяют dummy филиалу 999 и потом раздают на него права как обычно. Или что-то в этом роде. И всё работает.
А включать и выключать SectionAccess не получится. Нужно тогда делать две Application с SectionAccess и без.
Но я бы не стал так делать. Слишком много мороки их оба синхронизировать. Проще сделать так, чтобы всё работало в одном.
Привет! Недавно сам решал примерную задачу. Необходимо было разграничить доступ к складу. В SECTION Access занес пользователей, в поле REDUCTION номера или ID склада к которому нужен доступ пользователю.
Далее в справочнике склада через SECTION Application, код справочника переименовал в поле REDUCTION, все работает. Попробуй сделать таким же способом. Тебе справочник филиалов нужно загружать через SECTION Application, переименовать поле [Филиал Клиента] в REDUCTION, а в SECTION Access в поле REDUCTION для каждого пользователя прописать свой филиал.
SECTION Access;
LOAD * Inline
[ ACCESS,NTNAME,REDUCTION
ADMIN,sidorov,*
USER,zaicev,2
USER,petrov,3
USER,ivanov,1
];
SECTION Application;
Справочник_склада:
LOAD
ID_SKLAD,
NAME_SKLAD,
CODE_SKLAD as REDUCTION,
CODE_SKLAD;
FROM ...
необходимо понимать что * в секции доступа значит не все значения в приложении, а все значение перечисленные в секции доступа
Можно обойти данное ограничение таким образом Section Access "Star"
В данный момент у меня "Филиал клиента" присутствует и в SECTION Access, и в SECTION Application.
Все написано точно так же, как у тебя:
От того, что я переименую "Филиал клиента" в Reduction, что-то изменится?
По идее должно работать.
SECTION Access должен быть таким:
SECTION Access;
LOAD * Inline
[ ACCESS,NTNAME,REDUCTION
ADMIN,sidorov,*
USER,zaicev,2
USER,petrov,3
USER,ivanov,1];
SECTION Application должен быть примерно таким:
SECTION Application;
LOAD
...,
[Филиал Клиента] as REDUCTION,
[Филиал Клиента],
...;
FROM ...
У вас все работает, потому что имеется всего 3 склада и все они указаны в Section Access, следовательно у Сидорова будут видны 3 склада.
А если, предположим, всего склада не 3, а 4 и конструкция Section Access будет та же самая, Сидорову будут видны по-прежнему только 3 склада, склад №4 виден не будет.
Нужно просто сделать ещё одну таблицу между фактами и section access. А права раздавать одним по именам а другим например "все"
Спасибо за ответ. Посмотрите пример ниже - к сожалению, ни один пользователь не увидит продажи на 5000, т.к. по ним не задан клиент. А требуется, чтобы продвинутые пользователи их видели. Как решить эту проблему?
Section Access | Таблица 2 | Клиенты | Продажи | |||||
Имя | NTNAME | NTName | Филиал клиента | Филиал Клиента | Название клиента | Id клиента | Id клиента | Сумма |
Иванов | Ivanov | Ivanov | Филиал 1 | Филиал 1 | Ромашка | 1 | 1 | 1000 |
Петров | все | все | Филиал 1 | Филиал 2 | Лютик | 2 | 2 | 3000 |
Сидоров | Sidorov | Sidorov | Филиал 2 | -- | 5000 | |||
все | Филиал 2 |
На самом деле это была только наводка по быстрому из-за отсутствия времени, как такие вещи надо делать. Извините. Теперь правильно: нужно добавить к Section Access ещё одно поле с правами. В дополнительной таблице должны быть все права с мэппингом к соответствующим филиалам. По этому принципу можно разделять права на филиалы по регионам, областям и т.д.
Дополнила ваш пример таблицей с продажами (крайняя справа). Посмотрите, в этом случае пользователь с полным доступом не увидит продажу на сумму 5000:
В идеале нужно, чтобы для пользователей с полным доступом SectionAccess вообще не применялся