Blog JSystems - uwalniamy wiedzę!

Szukaj
Infografika RLS statyczny i dynamiczny w Power BI: rola Region Południe z filtrem regionu oraz rola Manager sklepu z USERPRINCIPALNAME i tabelą MapaManagerow
Dwa warianty RLS obok siebie. W statycznym tworzysz rolę z filtrem, na przykład Region Południe z DimSklepy[Region] = "Południe", i przypisujesz do niej osoby w usłudze Power BI. W dynamicznym funkcja USERPRINCIPALNAME() zwraca adres zalogowanej osoby, tabela MapaManagerow zamienia go na sklep, a jedna rola Manager sklepu obsługuje wszystkich kierowników.

W skrócieRLS (Row-Level Security) to zabezpieczenia na poziomie wiersza: ten sam raport pokazuje każdemu odbiorcy tylko jego dane. Na raporcie Nordvelli budujemy role statyczne i rolę dynamiczną z USERPRINCIPALNAME i tabelą mapującą, testujemy je przez Wyświetl jako i przypisujemy osobom w usłudze Power BI.

Lekcja 21 z 28 bezpłatnego kursu Power BI, od pierwszego raportu do Fabric i Copilota, na jednym zestawie danych sieci Nordvella.

<-- Spis wszystkich lekcji
<-- Lekcja 20: modele złożone, tryb Dual i agregacjeLekcja 22: Etykiety poufności i zabezpieczenie kolumn (OLS) -->

Masz w Nordvelli jeden raport sprzedaży: kartę z łączną sprzedażą 467,78 mln zł, tabelę sklepów i wykres miast. Teraz zarząd chce, żeby ten sam plik otwierali kierownicy piętnastu sklepów, ale każdy ma widzieć wyłącznie swój sklep, nie całą sieć. Piętnaście kopii raportu rozjedzie się przy pierwszej zmianie miary. Rozwiązaniem jest RLS, czyli zabezpieczenia na poziomie wiersza (po angielsku Row-Level Security). RLS filtruje dane zależnie od tego, kto ogląda raport, przy jednym wspólnym pliku i jednym modelu.

W tym rozdziale przejdziemy pełną ścieżkę na modelu Nordvelli: od roli statycznej dla jednego regionu, przez test roli bez publikowania, po dynamiczny RLS z funkcją USERPRINCIPALNAME i tabelą mapującą, w której jedna reguła obsługuje wszystkich kierowników. Pokażemy też pułapkę, w którą łatwo wpaść przy pierwszej roli dynamicznej: reguła jest aktywna, a raport dalej pokazuje całą sieć. Na końcu opublikujemy model, przypiszemy do roli osobę w usłudze Power BI i przejdziemy przez najczęstsze problemy, przez które ktoś widzi za dużo albo za mało.

Z tej lekcji dowiesz się:

Pliki do tej lekcji

Gotowy efekt: plik Power BI Desktop w stanie z końca tej lekcji, z tymi samymi zapytaniami, modelem i stronami raportu, które widać na zrzutach.

Pobierz nordvella_21_rls.pbix

Plik startowy: model po optymalizacji z lekcji 18. Lekcje 19 (odświeżanie przyrostowe) i 20 (model złożony) to osobne gałęzie, do RLS ich nie potrzebujesz.

Pobierz nordvella_18_optymalizacja.pbix

Dane źródłowe:
Nordvella_dane.xlsx - dziewięć tabel Nordvelli w arkuszu Excel.

Pobierz Nordvella_dane.xlsx

Raport Nordvelli bez roli i z rolą Sklep Warszawa obok siebie: 468 mln zł sprzedaży całej sieci i 223 mln zł czterech sklepów warszawskich
Ten sam raport, ta sama strona, żadnej zmiany w wizualizacjach. Po lewej bez roli: 468 mln zł i 109 tys. transakcji w piętnastu sklepach. Po prawej z rolą Sklep Warszawa: 223 mln zł, 52 tys. transakcji i cztery sklepy z Warszawy, w tym sklep internetowy, bo w danych Nordvelli ma on miasto Warszawa. Czerwone plakietki nad zrzutami dodaliśmy my.

Po co RLS i jak on działa

Co chcemy osiągnąć. Raport Nordvelli trafi do dyrektorów regionów i kierowników sklepów, a każdy z nich powinien widzieć tylko dane swojego regionu albo sklepu. Chcemy zapisać takie ograniczenie w samym modelu, zamiast budować osobny raport dla każdej osoby.

RLS to reguła bezpieczeństwa zapisana wewnątrz modelu danych. Definiujesz rolę i piszesz dla niej wyrażenie DAX, które dla każdego wiersza wybranej tabeli zwraca prawdę albo fałsz. Gdy osoba przypisana do roli otwiera raport, Power BI dokłada ten filtr do każdego zapytania, które wysyłają wizualizacje. Ta osoba nie widzi ani reguły, ani tego, że coś zostało odcięte: jej karty i wykresy po prostu pokazują liczby policzone na dozwolonych wierszach. Obraz nad tą sekcją pokazuje to na raporcie Nordvelli z rolą Sklep Warszawa.

Kluczowa rzecz, zanim napiszesz pierwszy filtr: w modelu gwiazdy filtr nakładasz na tabelę wymiaru, nie na tabelę faktów. W Nordvelli chcemy ograniczyć sprzedaż do wybranych sklepów. Nie piszemy więc reguły dla 108 675 wierszy FaktSprzedaz, tylko dla 15 wierszy DimSklepy. Relacja jeden do wielu między DimSklepy a FaktSprzedaz przenosi to ograniczenie dalej: jeśli w DimSklepy zostaną tylko sklepy krakowskie, przez relację po SklepID w FaktSprzedaz zostaną tylko ich transakcje. Filtr na wymiarze sprawdza mniej wierszy i płynie w naturalnym kierunku relacji.

Widok modelu Power BI: zaznaczona relacja FaktSprzedaz i DimSklepy po SklepID, panel Właściwości z kardynalnością Wiele do jednego i kierunkiem Pojedyncza
Od tej relacji zależy, czy RLS w ogóle zadziała. Po kliknięciu linii między FaktSprzedaz a DimSklepy panel Właściwości pokazuje komplet: klucz SklepID po obu stronach, Wiele do jednego (*:1), włączone Aktywuj tę relację i Kierunek filtrowania krzyżowego Pojedyncza. Filtr nałożony na DimSklepy spłynie do FaktSprzedaz, w drugą stronę nie. Gdyby relacja była nieaktywna, reguła na DimSklepy nie odcięłaby niczego w sprzedaży.

Wyobraź sobie, że kierownik z Krakowa otwiera raport Nordvelli. Bez RLS jego karta sprzedaży pokazuje 467,78 mln zł, czyli całą sieć. Z rolą, która zostawia w DimSklepy tylko Kraków, ta sama karta i ta sama miara pokażą 50,48 mln zł z dwóch krakowskich sklepów. Raport się nie zmienia i nie ma żadnej kopii pliku. Cały mechanizm siedzi w modelu.

Infografika: jak USERPRINCIPALNAME i tabela MapaManagerow zawężają raport Nordvelli do jednego sklepu w czterech krokach
Ten sam pomysł w wersji automatycznej. Usługa zna adres osoby, która otwiera raport, na przykład piotr.nowak@nordvella.pl. Funkcja USERPRINCIPALNAME() przekazuje go regule roli, tabela MapaManagerow zamienia adres na sklep 4, a filtr na DimSklepy zostawia tylko ten sklep: 31 545 740 zł sprzedaży. Zbudujemy to krok po kroku w dalszej części rozdziału.

Wskazówka: RLS ogranicza wiersze, z których liczą się wizualizacje. Nie ukrywa jednak nazw kolumn ani struktury raportu. Jeśli chcesz, żeby ktoś w ogóle nie wiedział, że w modelu istnieje kolumna Wynagrodzenie w DimPracownicy, RLS tego nie załatwi. Do tego służy zabezpieczenie na poziomie obiektu (OLS), które omawiamy w następnej lekcji.

Role statyczne w oknie Zarządzaj rolami

Co chcemy osiągnąć. Dyrektor Regionu Południe w Nordvelli ma widzieć tylko sklepy ze swojego regionu. Chcemy zbudować dla niego rolę ze stałą regułą filtrującą.

Zaczynamy od najprostszego wariantu: rola statyczna, czyli jedna stała reguła na jedną rolę. Kolumna Region w DimSklepy ma sześć wartości: Centrum, Południe, Zachód, Północ, Wschód i Online. Region Południe to trzy sklepy: dwa w Krakowie i jeden w Katowicach. To dobry kandydat na filtr statyczny.

Otwórz plik startowy z bloku Pliki do tej lekcji (ma gotowy model gwiazdy i nie ma jeszcze żadnych ról) i przejdź do widoku modelu. Przycisk Zarządzaj rolami jest w grupie Zabezpieczenia na karcie Narzędzia główne. W widoku raportu ten sam przycisk znajdziesz na karcie Modelowanie. Obok jest Wyświetl jako, którym za chwilę sprawdzimy wynik.

Karta Narzędzia główne w widoku modelu Power BI Desktop: przycisk Zarządzaj rolami z podpowiedzią Utwórz, zmień lub usuń role zabezpieczeń
Dwa przyciski obok siebie w grupie Zabezpieczenia: Zarządzaj rolami zakłada role, Wyświetl jako pokazuje, co zobaczy osoba, która je dostanie. Podpowiedź pod kursorem mówi wprost: Utwórz, zmień lub usuń role zabezpieczeń.

Okno Zarządzaj rolami zabezpieczeń ma trzy kolumny: Role po lewej, Tabele w środku i Reguły po prawej. Kliknij Nowy nad listą ról. Power BI doda rolę o nazwie Bez tytułu. Nazwę zmienisz w menu trzech kropek przy roli, poleceniem Zmień nazwę: wpisz Region Południe. Nazwa jest ważna, bo w usłudze będziesz przypisywać do roli ludzi właśnie po niej. Potem kliknij DimSklepy na liście tabel, a w kolumnie Reguły przycisk Nowy. Pojawi się wiersz kreatora z trzema polami: Kolumna, Warunek i Wartość. Wybierz Region, zostaw warunek Równa Się i wpisz Południe. Na koniec kliknij Zapisz.

Okno Zarządzaj rolami zabezpieczeń: rola Region Południe, tabela DimSklepy z ikoną filtra i reguła Region Równa Się Południe w kreatorze
Reguła w kreatorze czyta się jak zdanie: kolumna Region równa się Południe. Ikona lejka przy DimSklepy pokazuje, na której tabeli rola działa. Nad regułami jest ustawienie Pokaż dane jeśli Wszystkie z tych reguł są prawdziwe: przy kilku regułach wszystkie muszą być spełnione naraz. Na liście po lewej widać cztery role, które zbudujemy w tej części.

Kreator zapisuje regułę w modelu jako wyrażenie DAX. Sprawdziliśmy to w pliku z tej lekcji: reguła roli Region Południe ma postać:

[Region] == "Południe"

Podwójny znak równości to porównanie ścisłe. Różni się od zwykłego = tylko tym, że pusta wartość nie zrówna się z pustym tekstem ani z zerem. Ten sam warunek możesz wpisać sam w edytorze DAX, ze zwykłym =. Na danych Nordvelli wynik będzie identyczny, bo kolumna Region nie ma pustych wartości.

Reguła może być bogatsza niż pojedyncze porównanie. Załóżmy, że rola ma objąć dwa miasta i tylko salony flagowe (kolumna Typ ma w Nordvelli wartości Flagship, Standard, Compact i E-commerce). Kreator to zbuduje. Dodaj rolę Flagowce Kraków i Katowice, wybierz DimSklepy i dodaj dwie reguły. W pierwszej wybierz kolumnę Miasto, warunek W i wartości Kraków oraz Katowice (kolejne dokładasz przyciskiem Dodaj). W drugiej wybierz Typ, Równa Się i Flagship.

Kreator reguł roli Flagowce Kraków i Katowice: Miasto W Kraków, Katowice oraz Typ Równa Się Flagship
Kreator radzi sobie z listą wartości: warunek W przyjmuje kilka miast, każde jako osobny znacznik, a kolejne dokładasz przyciskiem Dodaj. Obie reguły muszą być spełnione razem, bo ustawienie nad nimi to Wszystkie.

Tę samą regułę zapiszesz w edytorze DAX. Kliknij Przełącz do edytora języka DAX i wpisz:

[Miasto] IN { "Kraków", "Katowice" }
    && [Typ] = "Flagship"
Edytor DAX w oknie Zarządzaj rolami: reguła roli Flagowce Kraków i Katowice z operatorem IN i warunkiem Typ równa się Flagship
Ta sama reguła w edytorze DAX. Operator IN sprawdza, czy miasto jest na liście w nawiasach klamrowych, a && łączy oba warunki: przejdą tylko sklepy flagowe w tych dwóch miastach. W Nordvelli to dwa sklepy, Kraków Stare Miasto i Katowice. Przycisk w prawym górnym rogu wraca do kreatora.

W pliku tej lekcji są cztery role statyczne, a do jednego modelu możesz dodać ich dowolnie wiele. Tabela poniżej pokazuje, co każda z nich zostawia w danych Nordvelli. Liczby policzyliśmy na pliku z bloku Pliki do tej lekcji.

RolaReguła na DimSklepyCo widzi użytkownik
Region Południe[Region] = "Południe"3 sklepy: Kraków Stare Miasto, Kraków Galeria i Katowice, razem 83 460 430 zł
Sklep Warszawa[Miasto] = "Warszawa"4 sklepy: trzy salony w Warszawie i sklep internetowy Nordvella Online, razem 222 818 295 zł
E-commerce[Typ] = "E-commerce"1 sklep: Nordvella Online, 141 772 849 zł
Flagowce Kraków i Katowice[Miasto] IN { "Kraków", "Katowice" } && [Typ] = "Flagship"2 sklepy: Kraków Stare Miasto i Katowice, razem 64 526 603 zł

Zwróć uwagę na rolę Sklep Warszawa. Filtr po mieście obejmuje też sklep internetowy, bo w DimSklepy Nordvella Online ma miasto Warszawa. Jeśli rola ma dotyczyć tylko salonów, dołóż drugą regułę, na przykład Typ nie równa się E-commerce. Takie niespodzianki widać dopiero w danych, dlatego każdą rolę sprawdzamy podglądem.

Test roli poleceniem Wyświetl jako

Co chcemy osiągnąć. Zanim raport z rolą trafi do dyrektora regionu, chcemy zobaczyć, co pokaże mu raport Nordvelli, bez publikowania i bez logowania na jego konto.

Nie publikuj roli, zanim nie sprawdzisz jej na własne oczy. Power BI Desktop ma do tego wbudowany podgląd. Przejdź do widoku raportu i na karcie Modelowanie kliknij Wyświetl jako (po angielsku View as). Otworzy się okno Wyświetl jako role z pozycjami Brak, Inni użytkownicy i listą Twoich ról. Zaznacz Region Południe i kliknij OK.

Okno Wyświetl jako role w Power BI Desktop: zaznaczona rola Region Południe, pozycje Brak i Inni użytkownicy oraz cztery role statyczne
Zanim raport trafi do kogokolwiek, sprawdzasz rolę u siebie. Pole Inni użytkownicy pozwala dodatkowo podstawić konkretny adres e-mail, co będzie potrzebne przy roli dynamicznej.

Nad raportem pojawi się jasny pasek z ikoną ostrzeżenia i napisem Oglądasz jako: Region Południe. To znak, że raport jest w trybie podglądu roli. Wszystkie wizualizacje przeliczają się natychmiast, jakby oglądał je ktoś z tej roli. Karta sprzedaży spada z 468 mln zł do 83 mln zł, liczba transakcji ze 109 tys. do 20 tys., a w tabeli zostają trzy sklepy: Katowice, Kraków Galeria i Kraków Stare Miasto. Jeśli liczby zgadzają się z tym, co ma widzieć dyrektor Południa, rola działa. Z podglądu wychodzisz przyciskiem Zatrzymaj wyświetlanie na prawym końcu paska.

Raport Nordvelli w podglądzie roli Region Południe: pasek Oglądasz jako, karta 83 mln zł i tabela trzech sklepów z Katowic i Krakowa
Nic w raporcie nie zostało przefiltrowane ręcznie, oba fragmentatory pokazują Wszystkie. Rola zawęża dane na poziomie modelu, więc karty, tabela i wykres miast przeliczają się same. Suma tabeli, 83 460 430 zł, to dokładnie sprzedaż trzech sklepów Regionu Południe.

Rola działa też na fragmentatorach. Rozwiń listę Miasto: zamiast jedenastu miast zobaczysz tylko Katowice i Kraków. Osoba z tą rolą nie dowie się z fragmentatora nawet tego, jakie inne miasta są w danych.

Rozwinięty fragmentator Miasto w podglądzie roli Region Południe: na liście tylko Katowice i Kraków
Fragmentator też widzi dane przez rolę. Lista miast kurczy się do dwóch pozycji, choć w DimSklepy jest jedenaście miast.

W oknie Wyświetl jako możesz zaznaczyć kilka ról naraz. Zaznacz Region Południe i Sklep Warszawa, kliknij OK. Pasek pokaże obie role, a raport sumę ich uprawnień: 306 mln zł, 71 tys. transakcji i siedem sklepów. Tak samo działa przypisanie jednej osoby do dwóch ról w usłudze Power BI: filtry ról łączą się operatorem lub.

Raport Nordvelli w podglądzie dwóch ról naraz, Region Południe i Sklep Warszawa: 306 mln zł i siedem sklepów w tabeli
Dwie role to suma, nie część wspólna. Region Południe daje 83 460 430 zł, Sklep Warszawa 222 818 295 zł, a razem 306 278 725 zł: tyle pokazuje suma tabeli. Gdyby filtry łączyły się przez i, raport byłby pusty, bo żaden sklep nie leży jednocześnie w Warszawie i w Regionie Południe.

Okno ma jeszcze opcję Inni użytkownicy z polem na adres e-mail. Przy rolach statycznych nie jest potrzebna. Przyda się przy roli dynamicznej, bo tam filtr zależy od tego, kto jest zalogowany, a w Desktopie bez podglądu funkcja USERPRINCIPALNAME zwraca nazwę konta Windows, na którym pracujesz (u nas POWERBI-KURS\powerbi). Wpisując adres testowego kierownika, symulujesz, że to on otwiera raport. Adres zatwierdź klawiszem Tab, a dopiero potem zaznacz rolę i kliknij OK. W naszych testach adres wpisany bez zatwierdzenia przepadał: pasek pokazywał samą rolę, bez adresu.

Tryb podgląduCo zaznaczasz w oknieDo czego służy
Sama rolapole przy nazwie rolitest roli statycznej (Region Południe, Sklep Warszawa)
Rola i inny użytkownikrola, Inni użytkownicy i adres zatwierdzony klawiszem Tabtest roli dynamicznej z USERPRINCIPALNAME
Kilka ról narazkilka pól z rolamisprawdzenie sumy uprawnień (filtry łączą się operatorem lub)

Wskazówka: podczas podglądu roli przejdź też do widoku tabeli i sprawdź liczbę wierszy, którą podaje pasek stanu na dole. Pod rolą Region Południe DimSklepy ma 3 wiersze, a FaktSprzedaz 19 709 zamiast 108 675. Jeśli DimSklepy pokazuje trzy sklepy, a FaktSprzedaz dalej ma pełne 108 675 wierszy, filtr nie płynie przez relację. Co wtedy sprawdzić, opisujemy w ostatniej części rozdziału.

Widok tabeli Power BI w podglądzie roli Region Południe: DimSklepy z trzema wierszami, Katowice i dwa sklepy w Krakowie
Podgląd roli działa też w widoku tabeli. Z piętnastu sklepów zostają trzy, a pasek stanu podaje: Tabela: DimSklepy (wiersze: 3). Zwróć uwagę na kolumnę Sprzedaż sklepu (zła) z lekcji 14 o CALCULATE: pokazuje 467775009,17 nawet pod rolą. To kolumna obliczeniowa, a takie kolumny Power BI liczy przy odświeżaniu danych, bez RLS. Wrócimy do tego przy benchmarku sieci.

Dynamiczny RLS z USERPRINCIPALNAME i tabelą mapującą

Co chcemy osiągnąć. Nordvella ma piętnaście sklepów, każdy z własnym kierownikiem, a piętnaście osobnych ról trzeba by poprawiać przy każdej zmianie kadrowej. Chcemy jednej roli, która sama rozpozna zalogowaną osobę i pokaże jej tylko jej sklep.

Role statyczne są proste, ale nie skalują się. Dynamiczny RLS rozwiązuje to jedną rolą, która sama rozpoznaje, kto ogląda raport. Trzon mechanizmu to funkcja USERPRINCIPALNAME. W usłudze Power BI zwraca nazwę główną użytkownika (po angielsku user principal name, w skrócie UPN), czyli login konta Microsoft, którym ktoś się zalogował. Zwykle jest to jego adres e-mail.

Potrzebujesz jeszcze tabeli mapującej, która łączy adres kierownika z jego sklepem. W danych Nordvelli jej nie ma, więc dodajemy ją sami. Najprościej zbudować małą tabelę w samym Power BI: w widoku tabeli kliknij Nowa tabela na karcie Narzędzia tabel i wpisz wyrażenie z funkcją DATATABLE. W firmie takie dane trzymasz zwykle w arkuszu albo w bazie i wczytujesz przez Power Query, ale do nauki wystarczy tabela zapisana w DAX:

MapaManagerow = DATATABLE(
    "Email", STRING,
    "SklepID", INTEGER,
    {
        { "anna.wisniewska@nordvella.pl",    1 },
        { "piotr.nowak@nordvella.pl",        4 },
        { "tomasz.lewandowski@nordvella.pl", 6 },
        { "robert.kaminski@nordvella.pl",    8 },
        { "michal.wisniewski@nordvella.pl", 10 },
        { "sylwia.pietrzak@nordvella.pl",   15 }
    }
)
Pasek formuły Power BI z tabelą MapaManagerow z funkcji DATATABLE i podgląd sześciu wierszy: adres e-mail i SklepID
DATATABLE pozwala wpisać małą tabelę wprost w DAX, bez osobnego pliku. Pod paskiem formuły widać wynik: sześć wierszy, w każdym adres kierownika i numer jego sklepu. Pasek stanu potwierdza: Tabela: MapaManagerow (wiersze: 6).

Tabela MapaManagerow ma dwie kolumny: Email (adres logowania do Power BI) i SklepID (ten sam klucz, którego używa DimSklepy). W pliku jest sześciu kierowników. W prawdziwym wdrożeniu dopiszesz tu wszystkich, po jednym wierszu na osobę. Teraz połącz tabelę z modelem: w widoku modelu przeciągnij SklepID z MapaManagerow na SklepID w DimSklepy. Otworzy się okno Nowa relacja.

Okno Nowa relacja między MapaManagerow i DimSklepy: Power BI proponuje kardynalność Jeden do jednego (1:1) i kierunek filtrowania Oba
Tu łatwo przeoczyć ważny szczegół. Power BI widzi, że numery sklepów są unikalne po obu stronach, więc proponuje Jeden do jednego (1:1), a taka relacja zawsze filtruje w obie strony, stąd kierunek Oba. Nie zatwierdzaj tego od razu.

Zmień ustawienia na Wiele do jednego (*:1) i Pojedyncza. Wiele do jednego, bo w prawdziwej firmie sklep może mieć dwóch kierowników albo zastępcę i wtedy ten sam SklepID pojawi się w mapie kilka razy. Pojedyncza, bo przy RLS chcemy jednego, przewidywalnego kierunku: filtr płynie od DimSklepy do MapaManagerow, nie odwrotnie. W następnej części zobaczysz, że ma to konsekwencje.

Okno Nowa relacja po zmianie: kardynalność Wiele do jednego (*:1) i kierunek filtrowania krzyżowego Pojedyncza
Po zmianie: Wiele do jednego (*:1) i kierunek Pojedyncza. Pole Zastosuj filtr zabezpieczeń w obu kierunkach jest wyszarzone, bo dotyczy tylko relacji filtrujących w obie strony. Kliknij Zapisz.
Widok modelu z tabelą MapaManagerow połączoną z DimSklepy i panel Właściwości relacji: Wiele do jednego, aktywna, kierunek Pojedyncza
MapaManagerow jest teraz w modelu obok DimSklepy, a panel Właściwości potwierdza relację: Wiele do jednego (*:1), aktywna, kierunek Pojedyncza. Strzałka na linii relacji wskazuje, w którą stronę płynie filtr.

Reguła roli dynamicznej: filtr musi trafić na DimSklepy

Co chcemy osiągnąć. Mamy tabelę mapującą i relację. Teraz chcemy roli Manager sklepu, która kierownikowi z Krakowa pokaże tylko jego sklep. Zrobimy to w dwóch podejściach, bo pierwsze, najbardziej intuicyjne, nie działa, a warto zobaczyć dlaczego.

Podejście pierwsze: filtr na tabeli mapującej. W oknie Zarządzaj rolami utwórz rolę Manager sklepu, wybierz tabelę MapaManagerow, przełącz się do edytora DAX i wpisz regułę, która porównuje kolumnę Email z adresem zalogowanej osoby:

[Email] = USERPRINCIPALNAME()
Okno Zarządzaj rolami: rola Manager sklepu z regułą [Email] = USERPRINCIPALNAME() na tabeli MapaManagerow w edytorze DAX
Pierwsze podejście: reguła na MapaManagerow. Zostawi w tabeli mapującej tylko wiersz z adresem zalogowanej osoby. Pytanie, czy to wystarczy, żeby zawęzić sprzedaż.

Sprawdź to w podglądzie. Kliknij Wyświetl jako, zaznacz Inni użytkownicy i wpisz piotr.nowak@nordvella.pl. Naciśnij Tab, zaznacz Manager sklepu i kliknij OK.

Okno Wyświetl jako role: zaznaczone Inni użytkownicy z adresem piotr.nowak@nordvella.pl i rola Manager sklepu
Przy roli dynamicznej sama rola nie wystarczy do testu: trzeba podstawić adres, bo reguła porównuje go z tabelą mapującą.

Pasek potwierdza: Oglądasz jako: Manager sklepu, piotr.nowak@nordvella.pl. A raport dalej pokazuje 468 mln zł i 109 tys. transakcji, czyli całą sieć.

Raport Nordvelli w podglądzie roli Manager sklepu dla piotr.nowak@nordvella.pl: mimo aktywnej roli 468 mln zł i wszystkie sklepy
Rola jest aktywna, adres podstawiony, a raport pokazuje komplet danych. Reguła odcięła wiersze w MapaManagerow, tylko że ten filtr nie ma jak dojść do sprzedaży.

Dlaczego? Filtr zostawił w MapaManagerow jeden wiersz, ze sklepem 4. Relacja między MapaManagerow a DimSklepy ma kierunek Pojedyncza, od DimSklepy do MapaManagerow. Filtr z tabeli mapującej nie płynie więc w stronę DimSklepy, a bez tego nie dotrze do FaktSprzedaz. Częsta rada brzmi: ustaw kierunek Oba i zaznacz Zastosuj filtr zabezpieczeń w obu kierunkach. Sprawdziliśmy to na modelu Nordvelli: Power BI odmawia zapisu takiej relacji.

Okno Edytowanie relacji MapaManagerow i DimSklepy z kierunkiem Oba i filtrem zabezpieczeń w obu kierunkach: komunikat o błędzie
Odmowa zapisu. Komunikat mówi, że tabela DimSklepy została skonfigurowana na potrzeby zabezpieczeń na poziomie wiersza, więc ustawienie zachowania filtrowania zabezpieczeń w tej relacji nie może mieć wartości Obydwie. DimSklepy ma tu reguły czterech ról statycznych.

Podejście drugie, które działa: filtr wprost na DimSklepy. Tabelę mapującą czytamy wewnątrz reguły. W roli Manager sklepu wyczyść regułę na MapaManagerow, kliknij DimSklepy i w edytorze DAX wpisz:

DimSklepy[SklepID] IN
    SELECTCOLUMNS (
        FILTER ( MapaManagerow, MapaManagerow[Email] = USERPRINCIPALNAME () ),
        "SklepID", MapaManagerow[SklepID]
    )
Edytor DAX roli Manager sklepu: reguła na DimSklepy z IN, SELECTCOLUMNS, FILTER i USERPRINCIPALNAME
Drugie podejście: reguła jest na DimSklepy, czyli na tabeli, z której filtr naturalnie płynie do sprzedaży. Tabela mapująca jest tylko źródłem listy numerów sklepów.

Prześledźmy, co się dzieje, gdy raport otwiera kierownik Krakowa. USERPRINCIPALNAME zwraca piotr.nowak@nordvella.pl. FILTER zostawia w MapaManagerow wiersz z tym adresem, a SELECTCOLUMNS wyciąga z niego jedną kolumnę, SklepID, z wartością 4. Reguła sprawdza dla każdego sklepu, czy jego numer jest na tej liście (operator IN), więc w DimSklepy zostaje tylko sklep 4, Nordvella Kraków Stare Miasto. Dalej działa zwykła relacja DimSklepy do FaktSprzedaz. Relacja z MapaManagerow może zostać jednokierunkowa, bo filtr nie musi przez nią przechodzić.

Raport Nordvelli w podglądzie roli Manager sklepu dla piotr.nowak@nordvella.pl: 32 mln zł i jeden sklep, Kraków Stare Miasto
Teraz rola działa. Pasek pokazuje rolę i adres, karta 32 mln zł, transakcji 7 tys., a w tabeli jest jeden sklep: Nordvella Kraków Stare Miasto, 31 545 740 zł.

Ta sama rola obsłuży każdego kierownika z mapy. Tabela poniżej pokazuje, co zobaczy każdy adres z pliku tej lekcji:

Zalogowany adres (USERPRINCIPALNAME)SklepIDCo pokaże raport
anna.wisniewska@nordvella.pl1Nordvella Warszawa Centrum, 34 740 655 zł
piotr.nowak@nordvella.pl4Nordvella Kraków Stare Miasto, 31 545 740 zł
tomasz.lewandowski@nordvella.pl6Nordvella Wrocław, 30 131 154 zł
robert.kaminski@nordvella.pl8Nordvella Gdańsk, 27 854 861 zł
michal.wisniewski@nordvella.pl10Nordvella Katowice, 32 980 864 zł
sylwia.pietrzak@nordvella.pl15Nordvella Online (sklep internetowy), 141 772 849 zł
adres, którego nie ma w mapiebrakpusty raport, karty pokazują dwie kreski

Zwróć uwagę na ostatni wiersz. Jeśli ktoś zaloguje się adresem, którego nie ma w MapaManagerow, lista numerów sklepów będzie pusta i raport też. To poprawne zachowanie, ale bywa mylące. Gdy dyrektor sprzedaży ma widzieć całą sieć, potrzebuje osobnego warunku. Najprościej dodać małą tabelę z adresami dyrektorów:

TabelaDyrektorow =
DATATABLE (
    "Email", STRING,
    { { "dyrektor@nordvella.pl" } }
)

i dopisać ją do reguły roli Manager sklepu operatorem lub:

VAR ZalogowanyEmail = USERPRINCIPALNAME ()
VAR CzyDyrektor =
    CONTAINS ( TabelaDyrektorow, TabelaDyrektorow[Email], ZalogowanyEmail )
RETURN
    CzyDyrektor
        || DimSklepy[SklepID]
            IN SELECTCOLUMNS (
                FILTER ( MapaManagerow, MapaManagerow[Email] = ZalogowanyEmail ),
                "SklepID", MapaManagerow[SklepID]
            )

Czytaj to tak: adres zalogowanej osoby trafia do zmiennej ZalogowanyEmail. CONTAINS sprawdza, czy ten adres jest w tabeli TabelaDyrektorow. Jeśli tak, CzyDyrektor jest prawdą dla każdego wiersza DimSklepy, więc dyrektor widzi wszystkie sklepy. Jeśli nie, decyduje część po operatorze lub (||), czyli ta sama lista sklepów z mapy co wcześniej. Tabeli TabelaDyrektorow nie ma w pliku do pobrania. Sprawdziliśmy ten wariant na tymczasowej tabeli z jednym adresem: dyrektor@nordvella.pl zobaczył całą sieć (467 775 009 zł), a piotr.nowak@nordvella.pl dalej tylko swój sklep (31 545 740 zł).

Wskazówka: USERPRINCIPALNAME w usłudze Power BI zwraca nazwę konta, którym ktoś zalogował się do chmury Microsoft. W Desktopie bez podglądu roli zwraca nazwę konta Windows (u nas POWERBI-KURS\powerbi), dlatego rolę dynamiczną testujesz polem Inni użytkownicy w oknie Wyświetl jako. Jeśli w firmie login różni się od adresu e-mail (na przykład domena logowania i domena poczty się rozjeżdżają), zapisz w tabeli mapującej dokładnie tę wartość, którą zwraca USERPRINCIPALNAME, a nie ładniejszy alias.

Role w usłudze Power BI: osoby i grupy

Co chcemy osiągnąć. Rola z Desktopu nikogo nie ogranicza, dopóki nie przypiszemy do niej ludzi w usłudze Power BI. Chcemy przypisać do ról Nordvelli osoby albo grupy tak, żeby zmiany kadrowe nie wymagały poprawiania raportu.

Najpierw publikacja. Zapisz plik, na karcie Narzędzia główne kliknij Opublikuj i wybierz obszar roboczy. My publikujemy do obszaru Nordvella Zarzad.

Okno Publikowanie w usłudze Power BI: lista obszarów roboczych z zaznaczonym Nordvella Zarzad
Okno publikowania pokazuje obszary robocze, do których masz dostęp. Zaznacz docelowy i kliknij Wybierz. Power BI wyśle do usługi raport i model semantyczny razem z rolami.

W usłudze otwórz obszar roboczy. Po publikacji są w nim dwa elementy o tej samej nazwie: raport i model semantyczny. Role należą do modelu, więc przy modelu nordvella_21_rls kliknij Więcej opcji (trzy kropki) i wybierz Zabezpieczenia.

Usługa Power BI, obszar Nordvella Zarzad: menu Więcej opcji modelu semantycznego nordvella_21_rls z podświetloną pozycją Zabezpieczenia
Menu modelu semantycznego. Pozycja Zabezpieczenia prowadzi do przypisywania ról. Listę odfiltrowaliśmy polem w prawym górnym rogu do nordvella_21, żeby w kadrze były tylko nasze dwa elementy.
Infografika JSystems o podziale pracy nad RLS: rola i filtr DAX w Power BI Desktop, przypisanie kont i grup w usłudze Power BI
Dwie kolumny, dwa różne miejsca. Po lewej to, co robisz w Desktopie i co da się sprawdzić bez chmury, po prawej to, bez czego reguła nikogo nie ogranicza. Jeśli strona Zabezpieczenia w usłudze nie pokazuje listy ról, opublikowany model ich nie ma.

Otworzy się strona Zabezpieczenia na poziomie wiersza. Po lewej jest lista ról z Desktopu, przy każdej liczba członków w nawiasie. Kliknij rolę, a po prawej w polu Osoby lub grupy należące do tej roli wpisz adres e-mail albo nazwę grupy, kliknij Dodaj, a na koniec Zapisz. W naszym środowisku demo nie ma grup, więc do roli Region Południe dodaliśmy jedno konto testowe, Martę Wiśniewską.

Strona Zabezpieczenia na poziomie wiersza w usłudze Power BI: rola Region Południe z jednym członkiem, Marta Wiśniewska
Pięć ról z Desktopu przyjechało razem z modelem. Region Południe ma jednego członka, pozostałe role nie mają nikogo. Zmiany zatwierdza dopiero Zapisz na dole strony.

Tu podejmujesz ważną decyzję: przypisywać ludzi pojedynczo czy przez grupę. Przy stałej strukturze lepiej przez grupę zabezpieczeń z katalogu firmowego (Microsoft Entra ID). Zamiast dodawać do roli Region Południe kolejne osoby, dodajesz jedną grupę, na przykład Nordvella-Region-Poludnie. Gdy ktoś dołącza do zespołu albo odchodzi, administrator zmienia skład grupy w jednym miejscu, a uprawnienia w raporcie idą za tym same.

Sposób przypisaniaZaletaKiedy stosować
Pojedyncze kontoSzybkie na start, bez kataloguTest, mały zespół, kilku odbiorców
Grupa zabezpieczeńJedno miejsce zmian, skaluje sięStała struktura, dużo osób, rotacja kadr

Rolę sprawdzisz też w usłudze, na dokładnie tym modelu, który widzą odbiorcy. Na stronie Zabezpieczenia na poziomie wiersza najedź na rolę, kliknij trzy kropki, które pojawią się obok jej nazwy, i wybierz Testuj jako rola. Raport otworzy się z zielonym paskiem u góry.

Usługa Power BI w trybie Testuj jako rola: zielony pasek Przeglądanie jako Region Południe i raport Nordvelli z 83 mln zł
Zielony pasek mówi, czyj widok oglądasz: Wyświetlanie nordvella_21_rls, Przeglądanie jako Region Południe. Liczby są te same co w Desktopie: 83 460 430 zł z trzech sklepów.

Od zapisu RLS działa w usłudze dla osób przypisanych do ról, gdy dostają raport przez udostępnienie, przez aplikację albo jako odbiorcy w obszarze roboczym. Jest jeden ważny wyjątek, o którym w następnej części: role obszaru roboczego wyższe niż Osoba przeglądająca omijają RLS.

Częste problemy z RLS i jak je rozwiązać

Co chcemy osiągnąć. Przy testach RLS w Nordvelli zdarza się, że ktoś widzi za dużo danych albo pusty raport. Chcemy umieć szybko znaleźć przyczynę każdego z czterech najczęstszych problemów.

RLS rzadko sprawia kłopot przy budowaniu. Kłopoty wychodzą przy testach, kiedy ktoś nagle widzi za dużo albo za mało. Przejdźmy przez cztery pułapki i sposób ich rozbrojenia na modelu Nordvelli.

Panel Dodaj osoby w obszarze roboczym Power BI: lista ról Administrator, Członek, Współautor i Osoba przeglądająca
Tu kryje się pierwszy problem z RLS. Komunikat w panelu mówi, że administratorzy, członkowie i współautorzy mają dostęp do edytowania i wyświetlania, a osoby przeglądające tylko do widoku. Reguły RLS działają wyłącznie na osobach przeglądających: Administrator, Członek i Współautor widzą wszystkie dane niezależnie od ról w modelu. Odbiorców raportu dodawaj więc jako Osoba przeglądająca.

Użytkownik widzi wszystkie dane mimo roli

Najczęstsza przyczyna: ta osoba ma w obszarze roboczym rolę Administrator, Członek albo Współautor. Te role omijają RLS, bo służą do edytowania, a nie tylko do czytania. Rozwiązanie: odbiorcy raportu mają być w obszarze w roli Osoba przeglądająca albo dostawać raport przez aplikację lub udostępnienie. Druga przyczyna to reguła, której filtr nie dochodzi do faktów. Przykład znasz z tej lekcji: reguła na MapaManagerow była aktywna, a raport pokazywał 468 mln zł. Trzecia: osoba należy do dwóch ról, a jedna z nich daje szeroki dostęp. Filtry ról się sumują, więc wygrywa ta szersza. W każdym z tych przypadków zacznij od podglądu Wyświetl jako z adresem tej osoby i sprawdź, ile wierszy zostaje w DimSklepy.

Filtr nie przechodzi na tabelę faktów

Nakładasz filtr na DimSklepy, ale FaktSprzedaz pokazuje pełne liczby. Powodem jest brak relacji, relacja nieaktywna albo połączenie po złej kolumnie. RLS filtruje wymiar, a resztę przenosi relacja od wymiaru do faktów. Sprawdź w widoku modelu, czy relacja DimSklepy do FaktSprzedaz istnieje i czy jest aktywna (linia ciągła, nie przerywana). Kierunek filtrowania zostaw pojedynczy: filtrowanie w obie strony potrafi przenieść ograniczenie z jednego wymiaru na drugi i dać wyniki, których się nie spodziewasz.

Okno Edytowanie relacji FaktSprzedaz i DimSklepy: klucz SklepID po obu stronach, Wiele do jednego, kierunek Pojedyncza i zaznaczone Aktywuj tę relację
Tu sprawdzasz wszystkie warunki naraz. Dwuklik na linii relacji otwiera to okno: Kardynalność Wiele do jednego (*:1), Kierunek filtrowania krzyżowego Pojedyncza i zaznaczone pole Aktywuj tę relację. Podgląd obu tabel u góry pokazuje, po której kolumnie idzie połączenie: po obu stronach podświetlony jest SklepID. Gdyby ktoś połączył tabele po nazwie sklepu zamiast po numerze, relacja też by powstała, tylko RLS zacząłby się mylić przy każdej literówce w nazwie.

Dynamiczny RLS zwraca pusty raport

Kierownik loguje się i widzi kreski we wszystkich kartach. Najczęściej to niedopasowanie adresu: wartość w kolumnie Email różni się od tego, co zwraca USERPRINCIPALNAME (literówka, spacja na końcu albo inna domena). W Desktopie ten sam objaw daje adres, który nie został przyjęty w oknie Wyświetl jako: pasek pokazuje wtedy samą rolę, bez adresu.

Raport Nordvelli w podglądzie roli Manager sklepu bez adresu na pasku: karty z dwiema kreskami i puste wizualizacje
Pusty raport w Desktopie. Pasek mówi tylko Oglądasz jako: Manager sklepu, bez adresu, bo adres w oknie Wyświetl jako nie został zatwierdzony klawiszem Tab. USERPRINCIPALNAME zwraca wtedy pusty tekst, lista sklepów z mapy jest pusta i karty pokazują dwie kreski.

Najszybciej sprawdzisz to w widoku zapytań DAX (czwarta ikona na pasku po lewej). Ten widok działa także w trybie podglądu roli, więc pokazuje dokładnie to, co widzi silnik pod rolą. Uruchom zapytanie:

EVALUATE
ROW (
    "Zalogowany", USERPRINCIPALNAME (),
    "Sklepy widoczne", COUNTROWS ( DimSklepy ) + 0,
    "Wiersze mapy", COUNTROWS ( MapaManagerow ) + 0
)

Dopisek + 0 zamienia pusty wynik na zero, żeby brak wierszy był widoczny od razu.

Widok zapytań DAX w Power BI Desktop: to samo zapytanie bez roli i pod rolą Manager sklepu, z adresem zalogowanego i liczbą widocznych sklepów
To samo zapytanie dwa razy. Bez roli (po lewej) USERPRINCIPALNAME zwraca nazwę konta Windows, POWERBI-KURS\powerbi, a model widzi 15 sklepów i 6 wierszy mapy. Pod rolą Manager sklepu z adresem piotr.nowak@nordvella.pl (po prawej) funkcja zwraca ten adres, a silnik widzi 1 sklep i 1 wiersz mapy. Czerwone plakietki dodaliśmy my.

Jeśli pod rolą Sklepy widoczne pokazuje 0, sprawdź, czy adres z pierwszej kolumny jest w tabeli mapującej. Listę wszystkich adresów z nazwami sklepów wypisze drugie zapytanie. Uruchom je bez podglądu roli, bo pod rolą zobaczysz tylko wiersz zalogowanej osoby:

EVALUATE
SELECTCOLUMNS (
    MapaManagerow,
    "Email", MapaManagerow[Email],
    "SklepID", MapaManagerow[SklepID],
    "Nazwa sklepu", RELATED ( DimSklepy[Nazwa] )
)
ORDER BY [SklepID]
Widok zapytań DAX: zapytanie z SELECTCOLUMNS i RELATED wypisuje sześć wierszy MapaManagerow z adresem, numerem i nazwą sklepu
Wynik: sześć wierszy, czyli sześciu kierowników z przypisanymi sklepami. RELATED zwraca nazwę sklepu, więc relacja z DimSklepy działa. Jeśli kierownik zgłasza pusty raport, a jego adresu nie ma na tej liście, problem jest w danych, nie w regule. Pasek stanu na dole podaje czas wykonania i liczbę wierszy.

Miara sumy całej sieci przestaje pokazywać całość

Czasem raport ma pokazywać kierownikowi jego sprzedaż obok średniej sieci, do porównania. Zwykła miara policzy tylko widoczne wiersze, bo RLS ogranicza każde zapytanie. Sam DAX nie obejdzie RLS: pod rolą Manager sklepu dla piotr.nowak@nordvella.pl wyrażenie CALCULATE ( [Łączna sprzedaż], ALL ( DimSklepy ) ) zwraca 31 545 740 zł, tyle samo co zwykła miara. ALL zdejmuje filtry raportu, ale nie filtr roli.

Uczciwe porównanie da się zbudować bez łamania zasad bezpieczeństwa. Wykorzystaj to, co widać na zrzucie z widoku tabeli: tabele i kolumny obliczeniowe Power BI liczy przy odświeżaniu danych, poza RLS. Dodaj tabelę obliczeniową (Nowa tabela), która przy każdym sklepie zapisze od razu średnią całej sieci:

BenchmarkSieci =
VAR Sklepy =
    ADDCOLUMNS (
        VALUES ( DimSklepy[SklepID] ),
        "SprzedazSklepu", [Łączna sprzedaż]
    )
VAR SredniaSieci = AVERAGEX ( Sklepy, [SprzedazSklepu] )
RETURN
    ADDCOLUMNS ( Sklepy, "SredniaSieci", SredniaSieci )

Połącz BenchmarkSieci z DimSklepy po SklepID (Wiele do jednego, Pojedyncza). Rola Manager sklepu zostawi w niej tylko wiersz sklepu zalogowanej osoby, a w tym wierszu jest już średnia całej sieci. Relacja jest tu konieczna: bez niej BenchmarkSieci nie podlega roli i każdy zobaczyłby sprzedaż wszystkich sklepów. Wynik sprawdzisz pod rolą w widoku zapytań DAX:

EVALUATE
ROW (
    "Moja sprzedaż", [Łączna sprzedaż],
    "Z ALL ( DimSklepy )", CALCULATE ( [Łączna sprzedaż], ALL ( DimSklepy ) ),
    "Średnia sieci", MAX ( BenchmarkSieci[SredniaSieci] ),
    "Wiersze benchmarku", COUNTROWS ( BenchmarkSieci )
)

U nas dla piotr.nowak@nordvella.pl wyszło: 31 545 740 zł, 31 545 740 zł, 31 185 001 zł i 1 wiersz. Średnia to 467 775 009 zł podzielone przez 15 sklepów. Kierownik widzi swoją sprzedaż i średnią sieci, ale nie sprzedaż pozostałych sklepów. Tabeli BenchmarkSieci nie ma w pliku do pobrania, dodaj ją sam, jeśli chcesz przećwiczyć ten wzorzec. Po dodaniu relacji Power BI może poprosić o ręczne odświeżenie (pasek z przyciskiem Odśwież teraz): kliknij go przed włączeniem podglądu roli, nie w trakcie.

Wskazówka: zanim opublikujesz model z RLS, przejdź listę kontrolną: każda rola sprawdzona w Wyświetl jako, rola dynamiczna sprawdzona polem Inni użytkownicy dla co najmniej dwóch różnych kierowników i dla adresu spoza mapy, relacje od wymiarów do faktów pojedyncze i aktywne, odbiorcy w obszarze roboczym w roli Osoba przeglądająca, a na stronie Zabezpieczenia przypisane grupy zamiast pojedynczych kont. Kilka minut sprawdzania chroni przed sytuacją, w której kierownik z Krakowa zobaczy wyniki Warszawy.

✕

Najczęściej zadawane pytania

Po co jest RLS i jak działa w Power BI?
RLS (Row-Level Security, bezpieczeństwo na poziomie wiersza) to mechanizm, który filtruje dane raportu w zależności od tego, kto go ogląda. Definiujesz rolę z wyrażeniem DAX na tabeli, a Power BI automatycznie dokłada ten filtr do każdego zapytania użytkownika przypisanego do roli. Manager sklepu w Krakowie widzi tylko swój sklep, choć wszyscy otwierają ten sam raport.
Czym różni się RLS statyczny od dynamicznego?
Statyczny RLS to jedna rola na jedną stałą regułę, na przykład rola Region Południe z filtrem DimSklepy[Region] = "Południe". Dynamiczny RLS używa funkcji USERPRINCIPALNAME i tabeli mapującej adres e-mail na sklep, dzięki czemu jedna rola obsługuje wszystkich kierowników, a każdy widzi tylko swój sklep. Nowa osoba to nowy wiersz w tabeli mapującej, a nie nowa rola.
Jak przetestować rolę RLS przed publikacją?
W Power BI Desktop wybierasz na karcie Modelowanie polecenie Wyświetl jako i zaznaczasz rolę. Przy roli dynamicznej zaznaczasz też Inni użytkownicy i wpisujesz adres testowej osoby, zatwierdzając go klawiszem Tab. Pasek nad raportem musi pokazać rolę i adres, na przykład Oglądasz jako: Manager sklepu, piotr.nowak@nordvella.pl. Jeśli pokazuje samą rolę, adres nie został przyjęty i raport roli dynamicznej będzie pusty.
Dlaczego użytkownik z rolą RLS widzi wszystkie dane?
Najczęściej ma w obszarze roboczym rolę Administrator, Członek albo Współautor. RLS działa tylko na osobach z rolą Osoba przeglądająca oraz na odbiorcach aplikacji i udostępnionych raportów. Druga przyczyna to reguła, której filtr nie dochodzi do tabeli faktów, na przykład reguła na tabeli mapującej połączonej z wymiarem relacją jednokierunkową. Trzecia to przypisanie do kilku ról naraz: ich filtry się sumują.
Dlaczego reguła na tabeli mapującej nie filtruje raportu?
Filtr płynie tylko w kierunku relacji. Przy relacji Wiele do jednego z kierunkiem Pojedyncza filtr idzie od DimSklepy do tabeli mapującej, nie odwrotnie, a Power BI nie pozwala włączyć filtru zabezpieczeń w obu kierunkach, gdy DimSklepy ma własne role. Rozwiązaniem jest reguła na DimSklepy: DimSklepy[SklepID] IN SELECTCOLUMNS ( FILTER ( MapaManagerow, MapaManagerow[Email] = USERPRINCIPALNAME () ), "SklepID", MapaManagerow[SklepID] ).

Komentarze (0)

Musisz być zalogowany by móc dodać komentarz. Zaloguj się przez Google

Brak komentarzy...