Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Динамические права в табличной модели / 25 сообщений из 25, страница 1 из 1
19.04.2017, 18:02
    #39441142
Динамические права в табличной модели
Добрый день.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

У Вас типичная модель ManyToMany между тремя измерениями, сделайте двунапрвленную связь между измерением "Fact_OlapFarmFilter" и "Торговые объекты" и проверьте еще раз алгоритм с Contains. Хотя мне кажется где то в ключевых полях ошиблись (в самой формуле)
...
Рейтинг: 0 / 0
20.04.2017, 17:51
    #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
20.04.2017, 17:56
    #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
20.04.2017, 18:20
    #39441843
Динамические права в табличной модели
mbabkin, спасибо

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

IDVT спасибо

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

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

заработало.

но медленнее гораздо выборка идет по сравнению с вариантом без этого фильтра
...
Рейтинг: 0 / 0
21.04.2017, 08:10
    #39442004
IDVT
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические права в табличной модели
Разумеется будут потери в скорости, Вы же видите в Profiler что происходит...
...
Рейтинг: 0 / 0
25.04.2017, 15:59
    #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
25.04.2017, 16:15
    #39444181
Динамические права в табличной модели
вроде функция ALL возвращает все строки таблицы, но как ее использовать в данном контексте, не знаю.
...
Рейтинг: 0 / 0
26.04.2017, 08:12
    #39444413
mbabkin
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Динамические права в табличной модели
Сергей Кургузов,

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

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

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


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