Ukrycie kolumny w raporcie nie chroni danych - OLS w Power BI
Udostępnij na:
Spis treści
Power BI - Bezpieczeństwo: RLS, OLS i etykiety poufności
Ukrycie kolumny w raporcie nie chroni danych - OLS w Power BI
W skrócie
Polecenie Ukryj w widoku raportu zdejmuje kolumnę z listy pól, ale nie chroni danych. Zapytanie DAX zwraca wartości ukrytej kolumny FaktSprzedaz[ProduktID], a miara na niej liczy się bez przeszkód, więc dla bezpieczeństwa danych w Power BI ukrycie nic nie daje.
Ukrycie to tylko właściwość wyświetlania. Kolumnę chroni zabezpieczenie na poziomie obiektu (OLS), czyli ustawienie roli, dla której kolumna nie istnieje. Według dokumentacji Microsoft razem z kolumną znikają miary, które z niej liczą.
OLS ustawiasz w Tabular Editorze albo w widoku TMDL, chronisz też kolumny, z których da się wyliczyć ukrywaną wartość, i sprawdzasz pod rolą zapytaniem, które próbuje ją odtworzyć. W Nordvelli marża wychodzi z wartości i kosztu: 77 028 109,17 zł.
Ukryj kolumnę w Power BI, a zniknie z panelu Dane: to częsty pierwszy pomysł na bezpieczeństwo marży albo wynagrodzeń. Problem pojawia się, gdy ktoś sięga do modelu inną drogą niż gotowy raport, na przykład zapytaniem DAX. Pokazujemy na modelu Nordvelli, co naprawdę robi ukrycie, czym różni się od zabezpieczenia na poziomie obiektu i jak zamknąć przeciek przez inne kolumny.
Jak to wygląda w praktyce
W modelu Nordvelli kolumny kluczy w FaktSprzedaz, czyli DataID, ProduktID, SklepID i PracownikID, są ukryte: nie ma ich w panelu Dane w widoku raportu. Zapytanie w widoku zapytań w języku DAX zwraca jednak ich wartości. Pięć pierwszych transakcji ma ProduktID 23, 3, 10, 7 i 18, a obok widać koszt własny każdej z nich: 5698, 6348, 6941, 8801 i 2922 zł. W lekcji 22 to samo zapytanie przeszło pod rolą Sprzedawca, która miała zablokowaną tylko kolumnę marży.
Ukryta kolumna działa też w miarach. Miara DISTINCTCOUNT ( FaktSprzedaz[ProduktID] ) zwraca 30 produktów, jakby kolumna była widoczna. Z punktu widzenia ochrony danych ukrycie niczego więc nie zmienia: kto może zadawać modelowi własne zapytania DAX, odczyta każdą ukrytą kolumnę.
Pięć wierszy z wartościami ukrytej kolumny ProduktID: 23, 3, 10, 7 i 18. Ukrycie nie zatrzymało zapytania. Ostatnia kolumna pokazuje koszt własny każdej transakcji, a to otwiera drogę do marży.
Ukrycie (prawy przycisk myszy na kolumnie w panelu Dane, polecenie Ukryj w widoku raportu) to właściwość wyświetlania. Porządkuje listę pól dla autora raportu, ale kolumna zostaje w modelu ze wszystkimi danymi. RLS też tego nie załatwi, bo według dokumentacji Microsoft osoba z dostępem do wiersza widzi wszystkie jego kolumny. Zabezpieczenie na poziomie obiektu (po angielsku object-level security, OLS) działa inaczej: w roli ustawiasz dla kolumny uprawnienie None i dla osób w tej roli kolumna wygląda tak, jakby nie istniała. Znikają razem z nią miary, które z niej liczą, wprost albo przez inne miary.
OLS chroni dokładnie te kolumny, które wskażesz. W tabeli faktów Nordvelli marża to wartość netto transakcji minus koszt własny. Gdy zablokujesz tylko FaktSprzedaz[MarzaNetto], rola dalej policzy różnicę WartoscNetto i KosztWlasny: 77 028 109,17 zł wobec 76 974 181,16 zł z miary Łączna marża. Różnica to 53 928,01 zł, bo koszt jest zaokrąglony do złotych: na transakcji najwyżej 0,99 zł, średnio 0,50 zł. Druga droga to Marża katalogowa z DimProdukty[MarzaNetto], 72 287 835 zł. Kolumny, które ukrywa się dla porządku, opisujemy w poście o ukrywaniu kluczy i kolumn technicznych.
Co zrobić krok po kroku
Spisz kolumny do ochrony razem z tymi, z których da się je wyliczyć. W Nordvelli dla marży to cztery kolumny: FaktSprzedaz[MarzaNetto], FaktSprzedaz[KosztWlasny], DimProdukty[MarzaNetto] i DimProdukty[MarzaProc]. Kolumny planu w FaktBudzet zostawiliśmy w kursie widoczne, bo o tym, czy plan marży ma widzieć sprzedawca, decyduje firma, a nie model.
Utwórz rolę bez filtra wierszy. Na karcie Modelowanie kliknij Zarządzaj rolami, potem Nowy, a nazwę nadaj z menu trzech kropek poleceniem Zmień nazwę, na przykład Sprzedawca. Enter zaraz po kliknięciu Nowy dodaje drugą rolę zamiast nazwy. Kliknij Zapisz i poczekaj na zielony pasek Pomyślnie zastosowano zmiany ról.
Power BI Desktop nie ma okna do OLS. Na karcie Narzędzia zewnętrzne kliknij Tabular Editor, w polu Filter wpisz nazwę kolumny, zaznacz ją w drzewie i w panelu właściwości rozwiń Object Level Security. W wierszu roli zmień Default na None, każdą kolumnę osobno. Dokumentacja Microsoft opisuje też drugą drogę, skrypt w widoku TMDL. Instalację narzędzia opisujemy w lekcji o grupach obliczeniowych i Tabular Editorze.
Zapisz zmiany dwa razy: Ctrl+S w Tabular Editorze (pasek stanu pokaże Changes saved.) i Ctrl+S w Desktopie, bo dopiero wtedy zabezpieczenie trafia do pliku .pbix. Przed każdą zmianą w Tabular Editorze wyłącz podgląd roli przyciskiem Zatrzymaj wyświetlanie. W kursie zmiana modelu przy włączonym podglądzie kończyła się komunikatem, że bieżąca sesja nie jest już prawidłowa.
Sprawdź przeciek pod rolą. Włącz Wyświetl jako z rolą Sprzedawca, otwórz widok zapytań w języku DAX i uruchom zapytanie poniżej. Bez OLS na koszcie zwraca 77 028 109,17 zł. Po zablokowaniu KosztWlasny kończy się błędem „Nie można odnaleźć kolumny „KosztWlasny” w tabeli „FaktSprzedaz” lub nie można jej użyć w tym wyrażeniu.” (w angielskiej wersji: „Column 'KosztWlasny' in table 'FaktSprzedaz' cannot be found or may not be used in this expression.”).
Przejrzyj raport strona po stronie pod rolą. Wizualizacje z miarami opartymi na chronionych kolumnach pokazują „Wystąpił problem z co najmniej jednym polem.”: w kursie zniknęła karta Marża % i cała tabela miast, choć marżę liczyła tylko jedna z pięciu kolumn tabeli. Zapytanie o miarę Łączna marża zwraca „Nie można określić wartości elementu „Łączna marża”. Kolumna nie istnieje lub nie ma bieżącego wiersza dla tej kolumny.” (w angielskiej wersji: „The value for 'Łączna marża' cannot be determined. Either the column doesn't exist, or there is no current row for this column.”). W modelu końcowym dziewięć miar odwołuje się do chronionych kolumn wprost, a kolejne pośrednio, jak Marża % przez Łączna marża. Czytanie takich błędów opisujemy w poście o szczegółach błędu elementu wizualnego.
Jak sprawdzić, że problem zniknął
Naprawione, gdy pod rolą z OLS każde zapytanie, które próbuje odtworzyć chronioną wartość, kończy się błędem, a raport dla tej roli nie zawiera wizualizacji z miarami marży. W lekcji 22 radzimy, żeby sprzedawcy dostali osobny raport na tym samym modelu, zbudowany bez tych miar. Według dokumentacji Microsoft OLS, tak jak RLS, ogranicza tylko osoby w roli Osoba przeglądająca: Administrator, Członek i Współautor obszaru widzą wszystkie kolumny.
Przed publikacją przejdź listę kontrolną: każda rola z OLS sprawdzona w podglądzie Wyświetl jako, zapytanie odtwarzające chronioną wartość kończy się błędem, osoba, która ma mieć filtr wierszy i OLS, ma jedną rolę z oboma zabezpieczeniami, a plik zapisany w Desktopie po zmianach z Tabular Editora. Osoby przypisujesz do roli w usłudze, na stronie Zabezpieczenia modelu.
Źródła i sposób sprawdzenia
Microsoft Learn: Object-level security (OLS) (źródło)
Microsoft Learn: Report consumer security planning (Object-level security) (źródło)
Microsoft Learn: Row-level security (RLS) with Power BI (FAQ: RLS a kolumny) (źródło)
Kurs Power BI, lekcja 22: OLS w Tabular Editorze, test roli, komunikaty błędów, ukrycie kolumny to nie zabezpieczenie, przeciek przez inne kolumny
Sprawdzone zapytaniami DAX na modelu Nordvelli: ukryte kolumny, wartości ProduktID, marża z wartości i kosztu, miary zależne od chronionych kolumn
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.
Nie. Polecenie Ukryj w widoku raportu usuwa kolumnę tylko z listy pól, a dane zostają w modelu. Zapytanie DAX na modelu Nordvelli zwróciło wartości ukrytej kolumny ProduktID, a miara na tej kolumnie policzyła 30 produktów. Kolumnę chroni dopiero zabezpieczenie na poziomie obiektu (OLS) w roli.
Jak ustawić OLS w Power BI Desktop?
Desktop nie ma do tego okna. Tworzysz rolę w oknie Zarządzaj rolami, a potem w Tabular Editorze, uruchamianym z karty Narzędzia zewnętrzne, ustawiasz dla kolumny w sekcji Object Level Security wartość None dla tej roli. Dokumentacja Microsoft opisuje też skrypt w widoku TMDL. Zmiany zapisujesz w Tabular Editorze i w Desktopie.
Dlaczego po OLS wizualizacja pokazuje błąd zamiast pustej kolumny?
Dla roli z OLS chroniona kolumna nie istnieje, więc wizualizacja, która z niej korzysta, nie może się policzyć. W kursie Power BI karta Marża % i cała tabela miast pokazały komunikat Wystąpił problem z co najmniej jednym polem, choć marżę liczyła tylko jedna z pięciu kolumn tabeli. Raport dla takiej roli buduje się bez miar opartych na chronionych kolumnach.
Czy OLS na jednej kolumnie wystarczy, żeby ukryć marżę w Power BI?
Zwykle nie, bo marżę da się wyliczyć z innych kolumn. W modelu Nordvelli wartość netto minus koszt własny dała 77 028 109,17 zł wobec 76 974 181,16 zł z miary Łączna marża. Trzeba zablokować także koszt własny oraz marżę i marżę procentową z tabeli produktów.
Komentarze (0)
Brak komentarzy...