powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Динамические права в табличной модели
25 сообщений из 25, страница 1 из 1
Динамические права в табличной модели
    #39441142
Добрый день.

куб на основе табличной модели SQL 2016. в нем таблицы
"Продажи" - ссылка/связь с таблицей торговых объектов, сумма продажи,
"Торговые объекты" - код торгового объекта ID, название
"ПользовательТорговыйОбъект" - код пользователя Olap_UserID, код торгового объекта SkdID (связан с торговыми объектами)

код пользователя передается в строке подключения через CustomData,
если бы пользователь имел доступ только к одному торговому объекту, то в роли можно прописать для таблицы "Торговые объекты" формулу DAX:
='Торговые объекты'[ID]=LOOKUPVALUE('ПользовательТорговыйОбъект'[SkdID];'ПользовательТорговыйОбъект'[Olap_UserID];CUSTOMDATA())

но, к сожалению, пользователь имеет доступ более чем к одному торговому объекту ...
как в данном случае отфильтровать по пользователю в таблице 'Торговые объекты' пока не знаю.

Может подскажете, какую функцию использовать можно?

С уважением, Сергей Кургузов
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441324
Доброе утро.
Может сумбурно написал ...
Чуть по-другому:
в модели есть таблицы: продажи, торговые объекты, пользователи и таблица связи торговых объектов с пользователями (ключ пользователя, ключ объекта).
В таблице продаж есть ссылка на торговые объекты. В модели есть связь по коду торгового объекта между продажами и торговыми объектами и между торговыми объектами и таблицей связи.
Также связаны таблица пользователей и таблица связей по ключу пользователя.
Реально ли по ключу пользователя через таблицу связи отфильтровать в таблице торговых объектов записи?

С уважением, Сергей Кургузов
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441431
vborets
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кончено реально, в чем проблема поставить фильтр по пользователю?
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441471
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Замените функцию LOOKUPVALUE(..) на CONTAINS(..) шустрее работает.
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441484
т.е. если в таблице пользователей поставлю фильтр по пользователю, то в продажах должен сработать фильтр по тем аптекам, которые к пользователю привязаны?
Сейчас схема в модели такая: продажи связаны с торговыми объектами, торговые объекты связаны с пользователями через таблицу связей.
Если я ставлю фильтр в таблице пользователей, то по этой цепочке сработает фильтр, даже если нет прямой связи продаж с пользователями?

Задаю вопрос, потому что не получилось так сделать (может криво что у меня ...)

С уважением, Сергей Кургузов
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441487
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
картинку покажите, что и как у вас связано, какая связь используется, какой объект нужно фильтровать по пользователю?

В вашем исходном примере, фильтрация накладывается на измерение 'Торговые объекты', но если пользователь не выберет атрибут из этого измерения, то он увидит все из таблицы фактов (если связь конечно между Фактами и 'Торговые объекты' не двунаправленная)
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441513
в приложении картинка с таблицами и связями между ними.

По этой схеме я хотел сделать так, чтобы на таблицу "Торговые объекты" накладывался фильтр в зависимости от того, какие торговые объекты связаны с конкретным пользователем.
т.е. пользователь входит в систему, в строке подключения в CUSTOMDATA передается значение поля "Account". По этому значению нахожу все торговые объекты (Formacie_ID) в таблице Fact_OlapFarmFilter и по ним фильтрую таблицу "Торговые объекты".
А в таблице продажи уже фильтр автоматом установится по ее связи с таблицей торговых объектов.
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441514
а это связи между таблицами
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441527
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет в наличие подходящего проекта для теста...

Фильтр измерения "Торговые объекты":
Код: sql
1.
2.
3.
4.
5.
=Contains( 'Fact_OlapFarmFilter' 
         ; 'Fact_OlapFarmFilter'[Account]
         ; CustomData()
                  ; 'Fact_OlapFarmFilter'[Formacie_ID]
                  ; 'Торговые объекты'[Formacie_ID] )

отпишитесь по результату теста
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441676
IDVT, спасибо за помощь.
Поправил формулу согласно реальным названиям, ошибок в ней нет, но не фильтрует.
В профайлере пишет:
Произошла ошибка при вычислении выражения безопасности уровня строки, определенного в таблице "Торговые объекты". Сообщение об ошибке: Возникло непредвиденное исключение.

С уважением, Сергей Кургузов
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441688
CONTAINS возвращает true или false, а мне же нужен набор
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441698
тут может как-то можно функцию Filter прикрутить?
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441724
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Таблицы "Fact_OlapFarmFilter" и "Торговые объекты" связаны по атрибуту [Formacie_ID]?

Если все верно, тогда остается только: LookupValue() т.к. он не учитывает связи, в отличие от Contains или сделать двунаправленную связь между "Fact_OlapFarmFilter" и "Торговые объекты" (разумеется если это не противоречит Вашей модели)
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441740
Таблицы "Fact_OlapPharmFilter" и "Торговые объекты" связаны по атрибуту [Farmacie_ID] - в первой таблице и [ID] - во второй. Они по разному называются. Формулу я правильно переписал, поправил названия , как в модели

LookupValue() вроде возвращает всего одно значение (из описания - "... если result_column возвращает различные значения, возвращается ошибка. ") или ошибаюсь? Просто один пользователь связан более чем с одним торговым объектом, ошибку вернет?
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441766
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сергей КургузовLookupValue() вроде возвращает всего одно значение Да все верно.

CONTAINS возвращает TRUE для тех строк, которые удовлетворяют условию (оно же выражение)

В профайлере пишет:
Произошла ошибка при вычислении выражения безопасности уровня строки, определенного в таблице "Торговые объекты". Сообщение об ошибке: Возникло непредвиденное исключение.

У Вас типичная модель ManyToMany между тремя измерениями, сделайте двунапрвленную связь между измерением "Fact_OlapFarmFilter" и "Торговые объекты" и проверьте еще раз алгоритм с Contains. Хотя мне кажется где то в ключевых полях ошиблись (в самой формуле)
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441813
mbabkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Кургузов,
В вашей модели динамичекие права можно задать 2 способами:
1. Фильтр к таблице Торговые объекты
Код: sql
1.
2.
3.
4.
5.
6.
7.
=
'Торговые объекты'[ID]
    = LOOKUPVALUE (
        'ПользовательТорговыйОбъект'[SkdID];
        'ПользовательТорговыйОбъект'[Olap_UserID]; CUSTOMDATA ();
        'ПользовательТорговыйОбъект'[SkdID]; 'Торговые объекты'[ID]
    )



В этом случае связь между 'Торговые объекты' и 'ПользовательТорговыйОбъект' не нужна
2. Фильр к таблице ПользовательТорговыйОбъект
Код: sql
1.
2.
3.
4.
5.
=
CONTAINS (
    'ПользовательТорговыйОбъект';
    'ПользовательТорговыйОбъект'[SkdID]; CUSTOMDATA ()
)



ну или если таблица 'ПользовательТорговыйОбъект' связана с таблицей Users можно просто сделать фильтр в таблице Users
Код: sql
1.
='Users[UserID] = CUSTOMDATA()'


При этом между таблицами 'Торговые объекты' и 'ПользовательТорговыйОбъект' в связи должно быть:
Filter Direction: To Both Tables
И флаг "apply the filter direction when using row level" должен стоять
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441818
mbabkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mbabkin,

Несколько запутался в ваших наименованиях полей
Скрипты такие
Код: sql
1.
2.
3.
4.
5.
6.
7.
=
'Торговые объекты'[ID]
    = LOOKUPVALUE (
        'ПользовательТорговыйОбъект';
        'ПользовательТорговыйОбъект'[Olap_UserID]; CUSTOMDATA ();
        'ПользовательТорговыйОбъект'[SkdID]; 'Торговые объекты'[ID]
    )



Код: sql
1.
2.
3.
4.
5.
=
CONTAINS (
    'ПользовательТорговыйОбъект';
    'ПользовательТорговыйОбъект'[Olap_UserID]; CUSTOMDATA ()
)
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39441843
mbabkin, спасибо

попробую и такой вариант.

IDVT спасибо

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

=Contains( 'Fact_OlapPharmFilter'
, 'Fact_OlapPharmFilter'[Account]
, CustomData()
, 'Fact_OlapPharmFilter'[Farmacie_ID]
, 'Торговые объекты'[ID] )

заработало.

но медленнее гораздо выборка идет по сравнению с вариантом без этого фильтра
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39442004
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумеется будут потери в скорости, Вы же видите в Profiler что происходит...
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39444165
Добрый день.
В продолжение темы

сделал в роли фильтр на таблице OlapUsers
= OlapUsers[Account] = CUSTOMDATA()

Работает.
Решил немного прооптимизировать - для пользователей из предопределенной роли (у которых доступ ко всему) не делать фильтр.
Вторую роль не получится сделать, так как с сайта все заходят под одной внутренней учеткой.

В связи с этим вопрос - можно наложить фильтр в роли только при выполнении какого-то условия?

Например, что можно написать в последнем аргументе формулы (где сейчас "не применять фильтр') для таблицы OlapUsers в роли, чтобы данный фильтр не применялся, как будто в поле фильтра пусто, если значение поля "RoleId" равно '4daa869e-9b24-4dbe-ac82-01b2a9373153':

Код: sql
1.
2.
= if(LOOKUPVALUE(OlapUsers[RoleId];OlapUsers[Account];CUSTOMDATA()) <> "4daa869e-9b24-4dbe-ac82-01b2a9373153";
 OlapUsers[Account] = CUSTOMDATA(); 'не применять фильтр')



С уважением, Сергей Кургузов
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39444181
вроде функция ALL возвращает все строки таблицы, но как ее использовать в данном контексте, не знаю.
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39444413
mbabkin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сергей Кургузов,

TRUE() попробуйте
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39444435
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для таблицы 'OlapUsers'...

Код: sql
1.
2.
3.
4.
If( CustomData() = "4daa869e-9b24-4dbe-ac82-01b2a9373153"
  ; 1=1
  ; Filter( 'OlapUsers'
          ; 'OlapUsers'[Account] = CustomData()))
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39444655
IDVT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то избыточно, утро, поспешил... =)

Код: sql
1.
2.
3.
If( CustomData() = "4daa869e-9b24-4dbe-ac82-01b2a9373153"
  ; 1=1
  ;'OlapUsers'[Account] = CustomData())
...
Рейтинг: 0 / 0
Динамические права в табличной модели
    #39445180
Добрый день.
Спасибо всем за помощь
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Динамические права в табличной модели
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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