Blog JSystems - uwalniamy wiedzę!

Szukaj

Power BI - Bezpieczeństwo: RLS, OLS i etykiety poufności

RLS i filtrowanie dwukierunkowe - Zastosuj filtr zabezpieczeń w obu kierunkach

W skrócie

  • Filtr zabezpieczeń RLS płynie domyślnie w jednym kierunku relacji, także gdy relacja ma kierunek Oba. Reguła na tabeli mapującej MapaManagerow zostawiła więc w Nordvelli całą sieć, 468 mln zł, a próba włączenia filtru zabezpieczeń w obu kierunkach skończyła się odmową zapisu.
  • Według dokumentacji Microsoft opcja włącza dwukierunkowe filtrowanie zabezpieczeń w jednej relacji tabeli i może spowolnić zapytania. Na modelu Nordvelli Power BI odmówił jej zapisu, bo tabela DimSklepy miała już reguły czterech ról statycznych.
  • Zamiast opcji przenosisz regułę na wymiar DimSklepy i czytasz tabelę mapującą wewnątrz wyrażenia. Relacja zostaje jednokierunkowa, a kierownik z Krakowa widzi tylko swój sklep, 31 545 740 zł.

Częsta rada na regułę RLS, której filtr nie dochodzi do faktów, brzmi: ustaw kierunek Oba i zaznacz opcję Zastosuj filtr zabezpieczeń w obu kierunkach. Taka reguła leży najczęściej na tabeli mapującej adresy na sklepy. Pokazujemy, jak działa filtr zabezpieczeń w obu kierunkach, dlaczego na modelu Nordvelli Power BI odmówił zapisu takiej relacji i jak zbudować regułę, która tej opcji nie potrzebuje.

Jak to wygląda w praktyce

W lekcji 21 rola Manager sklepu dostała regułę na tabeli MapaManagerow, która zostawia w mapie wiersz zalogowanej osoby. Podgląd z adresem piotr.nowak@nordvella.pl pokazywał na pasku rolę i adres, a raport całą sieć: 468 mln zł i 109 tys. transakcji. Relacja MapaManagerow do DimSklepy ma kardynalność Wiele do jednego (*:1) i Kierunek filtrowania krzyżowego ustawiony na Pojedyncza, a pole Zastosuj filtr zabezpieczeń w obu kierunkach jest wtedy wyszarzone.

Po zmianie kierunku na Oba i zaznaczeniu pola okno Edytowanie relacji nie zapisało zmiany. Komunikat zaczyna się od zdania „Tabela „DimSklepy” została skonfigurowana na potrzeby zabezpieczeń na poziomie wiersza, co oznacza wprowadzenie ograniczeń sposobu określania filtrów zabezpieczeń.” (w angielskiej wersji: „Table 'DimSklepy' is configured for row-level security, introducing constraints on how security filters are specified.”). Drugie zdanie, z nazwą relacji, mówi, że ustawienie zachowania filtrowania zabezpieczeń w tej relacji nie może mieć wartości Obydwie (w angielskiej wersji: „cannot be Both”).

Okno Edytowanie relacji MapaManagerow i DimSklepy z kierunkiem Oba i filtrem zabezpieczeń w obu kierunkach: błąd
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.

Dlaczego tak się dzieje

Filtr zwykły i filtr zabezpieczeń to dwie różne rzeczy. Kierunek filtrowania krzyżowego relacji decyduje, w którą stronę płyną filtry z fragmentatorów i wizualizacji. Według dokumentacji Microsoft filtry RLS płyną domyślnie w jednym kierunku, także w relacji z kierunkiem Oba. Dopiero pole Zastosuj filtr zabezpieczeń w obu kierunkach pozwala filtrowi roli przejść pod prąd. Dokumentacja dodaje dwa ograniczenia: gdy tabela ma kilka relacji dwukierunkowych, opcję zaznaczysz tylko w jednej z nich, a włączenie jej może spowolnić zapytania w dużych modelach.

Mechanizm sprawdziliśmy zapytaniem, w którym warunek roli jest zwykłym filtrem. Filtr na MapaManagerow zostawił 15 sklepów i 467 775 009,17 zł, a ten sam filtr z CROSSFILTER ustawionym na BOTH 1 sklep i 31 545 739,77 zł. Kierunek relacji przenosi więc ograniczenie, tylko RLS potrzebuje do tego osobnego ustawienia. Na modelu z lekcji nie dało się go włączyć, bo DimSklepy ma już reguły czterech ról statycznych. Ogólne skutki kierunku Oba opisujemy w poście o kierunku filtrowania Oba w relacji.

Co zrobić krok po kroku

  1. Sprawdź, na której tabeli leży reguła. Na karcie Modelowanie kliknij Zarządzaj rolami, wybierz rolę i zobacz, przy której tabeli jest ikona lejka. Gdy reguła dotyczy tabeli mapującej, a relacja z niej do wymiaru ma kierunek Pojedyncza, filtr zostanie w mapie i nie dotrze do sprzedaży.
  2. Przenieś regułę na wymiar. W roli Manager sklepu wyczyść regułę na MapaManagerow, kliknij DimSklepy, potem Przełącz do edytora języka DAX i wpisz wyrażenie poniżej. Tabela mapująca jest w nim tylko źródłem listy numerów sklepów, a filtr trafia na tabelę, z której naturalnie płynie do faktów. Kliknij Zapisz.
    DimSklepy[SklepID] IN
        SELECTCOLUMNS (
            FILTER ( MapaManagerow, MapaManagerow[Email] = USERPRINCIPALNAME () ),
            "SklepID", MapaManagerow[SklepID]
        )
  3. Zostaw relację MapaManagerow do DimSklepy jako Wiele do jednego (*:1) z kierunkiem Pojedyncza. Wiele do jednego, bo sklep może mieć kilku kierowników albo zastępcę. Pojedyncza, bo filtr nie musi już przechodzić przez tę relację. W modelu końcowym Nordvelli wszystkie relacje mają jednokierunkowe filtrowanie zabezpieczeń, co sprawdziliśmy zapytaniem do metadanych modelu.
  4. Przetestuj rolę. Kliknij Wyświetl jako, zaznacz Inni użytkownicy, wpisz piotr.nowak@nordvella.pl, naciśnij Tab, zaznacz Manager sklepu i kliknij OK. W kursie raport pokazał 32 mln zł, 7 tys. transakcji i jeden sklep, Nordvella Kraków Stare Miasto. Ten sam warunek ogranicza inne fakty połączone z DimSklepy: w zapytaniu budżet sprzedaży spadł z 541 917 189,40 zł do 34 569 214,43 zł.
  5. Opcję w obu kierunkach zostaw na modele, w których filtr roli musi przejść przez relację pod prąd, a reguły nie da się przenieść na wymiar. Dokumentacja Microsoft wskazuje ją przy dynamicznym RLS opartym na nazwie użytkownika albo loginie. Włączasz ją w oknie Edytowanie relacji: Kierunek filtrowania krzyżowego na Oba, potem pole Zastosuj filtr zabezpieczeń w obu kierunkach. Na drugą taką relację przy tej samej tabeli silnik ma komunikat „Tabela „MapaManagerow” ma już relację, w której zachowanie filtrowania zabezpieczeń zostało ustawione na wartość Oba. W każdej tabeli dozwolona jest tylko jedna relacja z tym ustawieniem.” (w angielskiej wersji: „Table 'MapaManagerow' already has a relationship where Security Filtering Behavior is set to Both. Only one relationship per table with this setting is allowed.”).
  6. Przy włączonej opcji pilnuj członkostwa w rolach. Osoba w kilku rolach, z których jedna filtruje tabelę z taką relacją, dostaje błąd zamiast sumy danych ról. Pełny komunikat i zasady łączenia ról opisujemy w poście o użytkowniku w dwóch rolach RLS. Wpływ na czas zapytań porównasz w okienku Analizator wydajności, według dokumentacji Microsoft najpierw bez roli, potem w podglądzie Wyświetl jako.

Jak sprawdzić, że problem zniknął

Naprawione, gdy pod rolą z adresem kierownika raport pokazuje jego sklep, a relacja z tabeli mapującej zostaje jednokierunkowa. Pod podglądem roli uruchom w widoku zapytań w języku DAX zapytanie z licznikami COUNTROWS ( DimSklepy ) i COUNTROWS ( MapaManagerow ): w kursie dało 1 sklep i 1 wiersz mapy dla Piotra Nowaka. Sprawdź też drugiego kierownika i adres spoza mapy, który ma dać pusty raport.

Pisz reguły RLS na tabelach wymiarów, a tabele mapujące czytaj wewnątrz wyrażenia. Gdy w modelu pojawia się relacja z kierunkiem Oba, od razu sprawdź, czy przechodzi przez nią filtr roli, i zapisz w opisie modelu, dlaczego włączono przy niej filtr zabezpieczeń. Relacje i ich kierunki omawiamy w lekcji o modelu gwiazdy i relacjach.

Źródła i sposób sprawdzenia

  • Microsoft Learn: Row-level security (RLS) with Power BI (Bi-directional cross-filtering with RLS) (źródło)
  • Microsoft Learn: Enable bidirectional cross-filtering for DirectQuery in Power BI Desktop (źródło)
  • Microsoft Learn: Row-level security (RLS) guidance in Power BI Desktop (filtry na wymiarach, Analizator wydajności) (źródło)
  • Microsoft Learn: CROSSFILTER function (DAX) (źródło)
  • Kurs Power BI, lekcja 21: tabela mapująca i relacja Wiele do jednego, reguła roli dynamicznej (odmowa zapisu relacji z filtrem zabezpieczeń w obu kierunkach)
  • Sprawdzone zapytaniami DAX na modelu Nordvelli: filtr na MapaManagerow z CROSSFILTER i bez, reguła na DimSklepy, metadane relacji

Zachowanie programu sprawdziliśmy w Power BI Desktop 2.157 (wydanie z sierpnia 2026 r.) z polskim interfejsem, a przykłady na modelu sieci Nordvella z bezpłatnego kursu Power BI. Microsoft wydaje nową wersję Power BI Desktop co miesiąc, więc nazwy przycisków i limity usługi mogą się zmieniać. Aktualne wartości podaje dokumentacja Microsoft Learn.

Wróć do listy: 131 najczęstszych pytań i problemów związanych z Power BI

Najczęściej zadawane pytania

Co robi opcja Zastosuj filtr zabezpieczeń w obu kierunkach w Power BI?
Pozwala filtrowi roli RLS przejść przez relację w obie strony. Według dokumentacji Microsoft filtry zabezpieczeń płyną domyślnie w jednym kierunku, także w relacji z kierunkiem Oba. Opcję włącza się w oknie Edytowanie relacji po ustawieniu kierunku filtrowania krzyżowego na Oba, w jednej relacji danej tabeli.
Dlaczego pole Zastosuj filtr zabezpieczeń w obu kierunkach jest wyszarzone?
Pole dotyczy tylko relacji filtrujących w obie strony. Przy kierunku filtrowania krzyżowego Pojedyncza jest nieaktywne, tak było w kursie Power BI przy relacji tabeli MapaManagerow z DimSklepy. Najpierw trzeba ustawić kierunek Oba, ale zwykle lepiej przenieść regułę roli na tabelę wymiaru.
Dlaczego Power BI nie zapisuje relacji z filtrem zabezpieczeń w obu kierunkach?
W modelu Nordvelli silnik odmówił, bo tabela DimSklepy, do której filtr miał płynąć pod prąd, miała już reguły czterech ról statycznych. Komunikat mówił, że tabela została skonfigurowana na potrzeby zabezpieczeń na poziomie wiersza i ustawienie w relacji nie może mieć wartości Obydwie. Według dokumentacji opcję można też włączyć tylko w jednej relacji danej tabeli.
Jak zrobić dynamiczny RLS bez filtrowania dwukierunkowego?
Regułę roli pisze się na tabeli wymiaru, a tabelę mapującą czyta wewnątrz wyrażenia. W Nordvelli reguła na DimSklepy sprawdza, czy numer sklepu jest na liście z MapaManagerow dla adresu zwróconego przez USERPRINCIPALNAME. Dla kierownika z Krakowa zostawia jeden sklep i 31 545 740 zł, a relacja z mapy zostaje jednokierunkowa.

Komentarze (0)

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

Brak komentarzy...