Udostępnij za pośrednictwem


Filtrowanie poufnych danych tabeli przy użyciu filtrów wierszy i masek kolumn

Ważne

Ta funkcja jest dostępna w publicznej wersji zapoznawczej.

Ten artykuł zawiera wskazówki i przykłady dotyczące używania filtrów wierszy, masek kolumn i tabel mapowania w celu filtrowania poufnych danych w tabelach. Te funkcje wymagają wykazu aparatu Unity.

Co to są filtry wierszy?

Filtry wierszy umożliwiają zastosowanie filtru do tabeli, dzięki czemu zapytania zwracają tylko wiersze spełniające kryteria filtrowania. Filtr wierszy jest implementowane jako funkcja zdefiniowana przez użytkownika SQL (UDF). Obsługiwane są również funkcje zdefiniowane przez użytkownika języka Python i języka Scala, ale tylko wtedy, gdy są one opakowane w funkcje zdefiniowane przez użytkownika SQL.

Co to są maski kolumn?

Maski kolumn umożliwiają zastosowanie funkcji maskowania do kolumny tabeli. Funkcja maskowania ocenia w czasie wykonywania zapytań, podstawiając każde odwołanie do kolumny docelowej z wynikami funkcji maskowania. W większości przypadków użycia maski kolumn określają, czy zwracać oryginalną wartość kolumny, czy zredagować ją na podstawie tożsamości wywoływanego użytkownika. Maski kolumn są wyrażeniami napisanymi jako funkcje zdefiniowane przez użytkownika SQL lub udf języka Python lub Scala, które są opakowane w funkcje zdefiniowane przez użytkownika SQL.

Każda kolumna tabeli może mieć zastosowaną tylko jedną funkcję maskowania. Funkcja maskowania przyjmuje niemaskowaną wartość kolumny jako dane wejściowe i zwraca maskowaną wartość w wyniku. Wartość zwracana funkcji maskowania powinna być tego samego typu co maskowana kolumna. Funkcja maskowania może również przyjmować dodatkowe kolumny jako parametry wejściowe i używać ich w logice maskowania.

Jaka jest różnica między tymi filtrami i widokami dynamicznymi?

Widoki dynamiczne, filtry wierszy i maski kolumn umożliwiają stosowanie złożonej logiki do tabel i przetwarzanie decyzji dotyczących filtrowania w czasie wykonywania zapytań.

Widok dynamiczny to abstrakcyjny, tylko do odczytu widok jednej lub większej liczby tabel źródłowych. Użytkownik może uzyskać dostęp do widoku dynamicznego bez bezpośredniego dostępu do tabel źródłowych. Tworzenie widoku dynamicznego definiuje nową nazwę tabeli, która nie może być zgodna z nazwą żadnych tabel źródłowych ani innych tabel i widoków znajdujących się w tym samym schemacie.

Z drugiej strony skojarzenie filtru wiersza lub maski kolumny z tabelą docelową stosuje odpowiednią logikę bezpośrednio do samej tabeli bez wprowadzania nowych nazw tabel. Kolejne zapytania mogą nadal odwoływać się bezpośrednio do tabeli docelowej przy użyciu oryginalnej nazwy.

Użyj widoków dynamicznych, jeśli musisz zastosować logikę przekształcania, taką jak filtry i maski do tabel tylko do odczytu, a jeśli jest to dopuszczalne, aby użytkownicy odwołyli się do widoków dynamicznych przy użyciu różnych nazw. Jeśli chcesz filtrować dane podczas udostępniania przy użyciu funkcji udostępniania różnicowego, musisz użyć widoków dynamicznych. Użyj filtrów wierszy i masek kolumn, jeśli chcesz filtrować lub obliczać wyrażenia na podstawie określonych danych, ale nadal zapewniają użytkownikom dostęp do tabel przy użyciu ich oryginalnych nazw.

Zanim rozpoczniesz

Aby dodać filtry wierszy i maski kolumn do tabel, musisz mieć następujące elementy:

  • Obszar roboczy, który jest włączony dla wykazu aparatu Unity.
  • Funkcja zarejestrowana w wykazie aparatu Unity. Może to być funkcja zdefiniowana przez użytkownika SQL lub język Python lub funkcja UDF języka Scala zarejestrowana w wykazie aparatu Unity i opakowana w funkcji zdefiniowanej przez użytkownika SQL. Aby uzyskać szczegółowe informacje, zobacz Co to są funkcje zdefiniowane przez użytkownika?, klauzula maski kolumny i klauzula FILTER wiersza.

Należy również spełnić następujące wymagania:

  • Aby przypisać funkcję, która dodaje filtry wierszy lub maski kolumn do tabeli, musisz mieć EXECUTE uprawnienia do funkcji, USE SCHEMA schematu i USE CATALOG wykazu nadrzędnego.
  • Aby dodać filtry lub maski podczas tworzenia nowej tabeli, musisz również mieć CREATE TABLE uprawnienia do schematu.
  • Aby dodać filtry lub maski, zmieniając istniejącą tabelę, musisz również być właścicielem tabeli lub mieć MODIFY uprawnienia do tej tabeli.

Aby uzyskać dostęp do tabeli z filtrami wierszy lub maskami kolumn, zasób obliczeniowy musi spełniać następujące wymagania:

  • Klaster trybu dostępu współdzielonego w środowisku Databricks Runtime 12.2 LTS lub nowszym albo w usłudze SQL Warehouse.

Stosowanie filtru wierszy

Aby utworzyć filtr wierszy, należy napisać funkcję (UDF), aby zdefiniować zasady filtrowania, a następnie zastosować je do tabeli. Każda tabela może mieć tylko jeden filtr wierszy. Filtr wierszy akceptuje zero lub więcej parametrów wejściowych, w których każdy parametr wejściowy wiąże się z jedną kolumną odpowiadającej tabeli.

Filtr wiersza można zastosować przy użyciu Eksploratora wykazu lub poleceń SQL. W instrukcjach Eksploratora wykazu założono, że utworzono już funkcję i zarejestrowano ją w wykazie aparatu Unity. Instrukcje SQL zawierają przykłady tworzenia funkcji filtrowania wierszy i stosowania jej do tabeli.

Eksplorator wykazu

  1. W obszarze roboczym usługi Azure Databricks kliknij pozycję Ikona wykazu Wykaz.
  2. Przeglądaj lub wyszukaj tabelę, którą chcesz filtrować.
  3. Na karcie Przegląd kliknij pozycję Filtr wierszy: Dodaj filtr.
  4. W oknie dialogowym Dodawanie filtru wierszy wybierz wykaz i schemat zawierający funkcję filter, a następnie wybierz funkcję.
  5. W rozwiniętym oknie dialogowym wyświetl definicję funkcji i wybierz kolumny tabeli zgodne z kolumnami zawartymi w instrukcji funkcji.
  6. Kliknij przycisk Dodaj.

Aby usunąć filtr z tabeli, kliknij przycisk fx Filtr wierszy i kliknij przycisk Usuń.

SQL

Aby utworzyć filtr wierszy, a następnie dodać go do istniejącej tabeli, użyj funkcji CREATE FUNCTION i zastosuj ją przy użyciu polecenia ALTER TABLE. Funkcję można również zastosować podczas tworzenia tabeli przy użyciu polecenia CREATE TABLE.

  1. Utwórz filtr wierszy:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {filter clause whose output must be a boolean};
    
  2. Zastosuj filtr wierszy do tabeli przy użyciu nazwy kolumny:

    ALTER TABLE <table_name> SET ROW FILTER <function_name> ON (<column_name>, ...);
    

Dodatkowe przykłady składni:

  • Usuń filtr wierszy z tabeli:

    ALTER TABLE <table_name> DROP ROW FILTER;
    
  • Modyfikowanie filtru wiersza:

    Run a DROP FUNCTION statement to drop the existing function, or use CREATE OR REPLACE FUNCTION to replace it.
    
  • Usuń filtr wierszy:

    ALTER TABLE <table_name> DROP ROW FILTER;
    DROP FUNCTION <function_name>;
    

    Uwaga

    Przed usunięciem ALTER TABLE ... DROP ROW FILTER funkcji należy wykonać polecenie . Jeśli tego nie zrobisz, tabela będzie w stanie niedostępnym.

    Jeśli tabela stanie się w ten sposób niedostępna, zmień tabelę i upuść odwołanie filtru oddzielonego wiersza przy użyciu polecenia ALTER TABLE <table_name> DROP ROW FILTER;.

Zobacz również klauzulę ROW FILTER.

Przykłady filtrów wierszy

W tym przykładzie jest tworzona funkcja zdefiniowana przez użytkownika SQL, która ma zastosowanie do członków grupy admin w regionie US.

Po zastosowaniu sales tej przykładowej funkcji do tabeli członkowie admin grupy mogą uzyskiwać dostęp do wszystkich rekordów w tabeli. Jeśli funkcja jest wywoływana przez innego niż administrator, RETURN_IF warunek kończy się niepowodzeniem, a region='US' wyrażenie jest oceniane, filtrując tabelę tak, aby pokazywała tylko rekordy w US regionie.

CREATE FUNCTION us_filter(region STRING)
RETURN IF(IS_ACCOUNT_GROUP_MEMBER('admin'), true, region='US');

Zastosuj funkcję do tabeli jako filtr wiersza. Kolejne zapytania z sales tabeli zwracają podzbiór wierszy.

CREATE TABLE sales (region STRING, id INT);
ALTER TABLE sales SET ROW FILTER us_filter ON (region);

Wyłącz filtr wierszy. Przyszłe zapytania użytkownika z sales tabeli zwracają wszystkie wiersze w tabeli.

ALTER TABLE sales DROP ROW FILTER;

Utwórz tabelę z funkcją zastosowaną jako filtr wierszy w ramach instrukcji CREATE TABLE . Przyszłe zapytania z sales tabeli zwracają podzbiór wierszy.

CREATE TABLE sales (region STRING, id INT)
WITH ROW FILTER us_filter ON (region);

Stosowanie maski kolumny

Aby zastosować maskę kolumny, utwórz funkcję (UDF), a następnie zastosuj ją do kolumny tabeli.

Maskę kolumn można zastosować przy użyciu Eksploratora wykazu lub poleceń SQL. W instrukcjach Eksploratora wykazu założono, że utworzono już funkcję i zarejestrowano ją w wykazie aparatu Unity. Instrukcje SQL zawierają przykłady tworzenia funkcji maski kolumn i stosowania jej do kolumny tabeli.

Eksplorator wykazu

  1. W obszarze roboczym usługi Azure Databricks kliknij pozycję Ikona wykazu Wykaz.
  2. Przeglądaj lub wyszukaj tabelę.
  3. Na karcie Przegląd znajdź wiersz, do którego chcesz zastosować maskę kolumny, a następnie kliknij ikonę Maskuj edycjęIkona Edytuj.
  4. W oknie dialogowym Dodawanie maski kolumn wybierz katalog i schemat zawierający funkcję filter, a następnie wybierz funkcję.
  5. W rozwiniętym oknie dialogowym wyświetl definicję funkcji. Jeśli funkcja zawiera jakiekolwiek parametry oprócz maskowanej kolumny, wybierz kolumny tabeli, do których chcesz rzutować te dodatkowe parametry funkcji.
  6. Kliknij przycisk Dodaj.

Aby usunąć maskę kolumny z tabeli, kliknij przycisk fx Maska kolumny w wierszu tabeli i kliknij przycisk Usuń.

SQL

Aby utworzyć maskę kolumny i dodać ją do istniejącej kolumny tabeli, użyj funkcji CREATE FUNCTION maskowania i zastosuj ją przy użyciu polecenia ALTER TABLE. Funkcję można również zastosować podczas tworzenia tabeli przy użyciu polecenia CREATE TABLE.

Służy SET MASK do stosowania funkcji maskowania. W ramach klauzuli MASK można użyć dowolnej wbudowanej funkcji środowiska uruchomieniowego usługi Azure Databricks lub wywołać inne funkcje zdefiniowane przez użytkownika. Typowe przypadki użycia obejmują inspekcję tożsamości użytkownika wywołującego funkcję przy użyciu funkcji current_user( ) lub uzyskiwanie grup, do których należą.is_account_group_member( ) Aby uzyskać szczegółowe informacje, zobacz Klauzula maski kolumn i Wbudowane funkcje.

  1. Utwórz maskę kolumny:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {expression with the same type as the first parameter};
    
  2. Zastosuj maskę kolumny do kolumny w istniejącej tabeli:

    ALTER TABLE <table_name> ALTER COLUMN <col_name> SET MASK <mask_func_name> USING COLUMNS <additional_columns>;
    

Dodatkowe przykłady składni:

  • Usuń maskę kolumny z kolumny w tabeli:

    ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
    
  • Zmodyfikuj maskę kolumny: DROP istniejąca funkcja lub użyj polecenia CREATE OR REPLACE TABLE.

  • Usuń maskę kolumny:

    ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
    DROP FUNCTION <function_name>;
    

    Uwaga

    Przed usunięciem funkcji należy wykonać ALTER TABLE polecenie lub tabela będzie w stanie niedostępnym.

    Jeśli tabela stanie się w ten sposób niedostępna, zmień tabelę i upuść odwołanie do oddzielonej maski przy użyciu polecenia ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;.

Przykłady maski kolumn

W tym przykładzie utworzysz funkcję zdefiniowaną przez użytkownika, która maskuje kolumnę ssn tak, aby tylko użytkownicy, którzy są członkami HumanResourceDept grupy, mogli wyświetlać wartości w tej kolumnie.

CREATE FUNCTION ssn_mask(ssn STRING)
  RETURN CASE WHEN is_member('HumanResourceDept') THEN ssn ELSE '***-**-****' END;

Zastosuj nową funkcję do tabeli jako maskę kolumny. Maskę kolumn można dodać podczas tworzenia tabeli lub po.

--Create the `users` table and apply the column mask in a single step:

CREATE TABLE users (
  name STRING,
  ssn STRING MASK ssn_mask);
--Create the `users` table and apply the column mask after:

CREATE TABLE users
  (name STRING, ssn STRING);

ALTER TABLE users ALTER COLUMN ssn SET MASK ssn_mask;

Zapytania dotyczące tej tabeli zwracają teraz wartości kolumn maskowanych ssn , gdy użytkownik kwerendy nie jest członkiem HumanResourceDept grupy:

SELECT * FROM users;
  James  ***-**-****

Aby wyłączyć maskę kolumn, aby zapytania zwracały oryginalne wartości w kolumnie ssn :

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

Tworzenie listy kontroli dostępu za pomocą tabel mapowania

Aby uzyskać zabezpieczenia na poziomie wiersza, rozważ zdefiniowanie tabeli mapowania (lub listy kontroli dostępu). Każda tabela mapowania to kompleksowa tabela mapowania, która koduje wiersze danych w oryginalnej tabeli są dostępne dla niektórych użytkowników lub grup. Tabele mapowania są przydatne, ponieważ oferują prostą integrację z tabelami faktów za pomocą sprzężeń bezpośrednich.

Ta metodologia okazała się przydatna w rozwiązywaniu wielu przypadków użycia z wymaganiami niestandardowymi. Oto kilka przykładów:

  • Nakładanie ograniczeń na podstawie zalogowanego użytkownika przy jednoczesnym korzystaniu z różnych reguł dla określonych grup użytkowników.
  • Tworzenie skomplikowanych hierarchii, takich jak struktury organizacyjne, wymagające różnych zestawów reguł.
  • Replikowanie złożonych modeli zabezpieczeń z zewnętrznych systemów źródłowych.

Dzięki wdrożeniu tabel mapowania w ten sposób można skutecznie rozwiązać te trudne scenariusze i zapewnić niezawodne implementacje zabezpieczeń na poziomie wiersza i na poziomie kolumny.

Przykłady tabeli mapowania

Użyj tabeli mapowania, aby sprawdzić, czy bieżący użytkownik znajduje się na liście:

USE CATALOG main;

Utwórz nową tabelę mapowania:

DROP TABLE IF EXISTS valid_users;

CREATE TABLE valid_users(username string);
INSERT INTO valid_users
VALUES
  ('fred@databricks.com'),
  ('barney@databricks.com');

Utwórz nowy filtr:

Uwaga

Wszystkie filtry są uruchamiane z prawami zdefiniowanych z wyjątkiem funkcji, które sprawdzają kontekst użytkownika (na przykład CURRENT_USER funkcje i IS_MEMBER ), które są uruchamiane jako wywołacz.

W tym przykładzie funkcja sprawdza, czy bieżący użytkownik znajduje się w valid_users tabeli. Jeśli użytkownik zostanie znaleziony, funkcja zwróci wartość true.

DROP FUNCTION IF EXISTS row_filter;

CREATE FUNCTION row_filter()
  RETURN EXISTS(
    SELECT 1 FROM valid_users v
    WHERE v.username = CURRENT_USER()
);

Poniższy przykład stosuje filtr wierszy podczas tworzenia tabeli. Filtr można również dodać później przy użyciu instrukcji ALTER TABLE . Podczas stosowania do całej tabeli użyj ON () składni . W przypadku określonego wiersza użyj polecenia ON (row);.

DROP TABLE IF EXISTS data_table;

CREATE TABLE data_table
  (x INT, y INT, z INT)
  WITH ROW FILTER row_filter ON ();

INSERT INTO data_table VALUES
  (1, 2, 3),
  (4, 5, 6),
  (7, 8, 9);

Wybierz dane z tabeli. Powinno to zwracać dane tylko wtedy, gdy użytkownik znajduje się w valid_users tabeli.

SELECT * FROM data_table;

Utwórz tabelę mapowania zawierającą konta, które powinny zawsze mieć dostęp do wyświetlania wszystkich wierszy w tabeli, niezależnie od wartości kolumn:

CREATE TABLE valid_accounts(account string);
INSERT INTO valid_accounts
VALUES
  ('admin'),
  ('cstaff');

Teraz utwórz funkcję zdefiniowaną przez użytkownika SQL, która zwraca true wartość, jeśli wartości wszystkich kolumn w wierszu są mniejsze niż pięć lub jeśli wywoływany użytkownik jest członkiem powyższej tabeli mapowania.

CREATE FUNCTION row_filter_small_values (x INT, y INT, z INT)
  RETURN (x < 5 AND y < 5 AND z < 5)
  OR EXISTS(
    SELECT 1 FROM valid_accounts v
    WHERE IS_ACCOUNT_GROUP_MEMBER(v.account));

Na koniec zastosuj funkcję zdefiniowanej przez użytkownika SQL do tabeli jako filtr wiersza:

ALTER TABLE data_table SET ROW FILTER row_filter_small_values ON (x, y, z);

Obsługiwane funkcje i formaty

  • Obsługiwane są notesy usługi Databricks SQL i Databricks dla obciążeń SQL.

  • Obsługiwane są polecenia DML przez użytkowników z uprawnieniami MODIFY . Filtry i maski są stosowane do danych odczytywanych za pomocą UPDATE instrukcji i DELETE i nie są stosowane do zapisanych danych (w tym INSERT).

  • Obsługiwane formaty danych:

    • Delta i Parquet dla tabel zarządzanych i zewnętrznych.
    • Wiele innych formatów danych dla tabel obcych zarejestrowanych w wykazie aparatu Unity przy użyciu federacji Lakehouse.
  • Funkcje zdefiniowane przez użytkownika SQL, Python i Scala są obsługiwane jako funkcje filtrowania wierszy lub maski kolumn, o ile są one zarejestrowane w wykazie aparatu Unity. Funkcje zdefiniowane przez użytkownika języka Python i języka Scala muszą być opakowane w funkcji zdefiniowanej przez użytkownika SQL.

  • Obsługiwane są widoki w tabelach z maskami kolumn lub filtrami wierszy.

  • Źródła danych zmian usługi Delta Lake są obsługiwane, o ile schemat jest zgodny z filtrami wierszy i maskami kolumn, które mają zastosowanie do tabeli docelowej.

  • MERGE instrukcje są obsługiwane, gdy tabele źródłowe, tabele docelowe lub obie używają filtrów wierszy i masek kolumn. Obejmuje to tabele z funkcjami filtru wierszy, które zawierają proste podzapytania, ale istnieją ograniczenia wymienione w poniższej sekcji.

  • Zmaterializowane widoki SQL usługi Databricks i tabele przesyłania strumieniowego SQL usługi Databricks obsługują filtry wierszy i maski kolumn (publiczna wersja zapoznawcza):

    • Filtry wierszy i maski kolumn można dodawać do widoku zmaterializowanego lub tabeli przesyłania strumieniowego usługi Databricks.
    • Możesz zdefiniować zmaterializowane widoki SQL usługi Databricks lub tabele przesyłania strumieniowego w tabelach zawierających filtry wierszy i maski kolumn.

Ograniczenia

  • Wersje środowiska Databricks Runtime poniżej wersji 12.2 LTS nie obsługują filtrów wierszy ani masek kolumn. Te środowiska uruchomieniowe kończą się niepowodzeniem bezpiecznie, co oznacza, że jeśli próbujesz uzyskać dostęp do tabel z nieobsługiwanych wersji tych środowisk uruchomieniowych, żadne dane nie są zwracane.
  • Zmaterializowane widoki i tabele przesyłania strumieniowego zadeklarowane w tabelach delta live nie obsługują filtrów wierszy ani masek kolumn.
  • Udostępnianie różnicowe nie działa z zabezpieczeniami na poziomie wiersza ani maskami kolumn.
  • Podróż w czasie nie działa z zabezpieczeniami na poziomie wiersza ani maskami kolumn.
  • Próbkowanie tabeli nie działa z zabezpieczeniami na poziomie wiersza ani maskami kolumn.
  • Dostęp oparty na ścieżkach do plików w tabelach z zasadami nie jest obsługiwany.
  • Zasady filtrowania wierszy lub maski kolumn z zależnościami cyklicznymi z powrotem do oryginalnych zasad nie są obsługiwane.
  • Głębokie i płytkie klony nie są obsługiwane.
  • MERGE instrukcje nie obsługują tabel z zasadami filtrowania wierszy, które zawierają zagnieżdżanie, agregacje, okna, limity lub funkcje niedeterministyczne.
  • Interfejsy API usługi Delta Lake nie są obsługiwane.
  • SHOW CREATE TABLE w zmaterializowanych widokach i tabelach przesyłania strumieniowego nie są wyświetlane informacje o filtrze wierszy i maskach kolumn.

Ograniczenie mocy obliczeniowej pojedynczego użytkownika

Nie należy dodawać filtrów wierszy ani masek kolumn do żadnej tabeli, do której uzyskujesz dostęp z klastra pojedynczego użytkownika. Jest to często wykonywane w kontekście przepływów pracy (zadań). W publicznej wersji zapoznawczej nie będzie można uzyskać dostępu do tabel z klastra pojedynczego użytkownika, jeśli zastosowano filtr lub maskę.