Tworzenie widoku dynamicznego
W katalogu Unity można użyć widoków dynamicznych, aby skonfigurować precyzyjną kontrolę dostępu, w tym:
- Zabezpieczenia na poziomie kolumn lub wierszy.
- Maskowanie danych.
Katalog Unity wprowadza następujące funkcje, które pozwalają dynamicznie ograniczać użytkownikom dostęp do wiersza, kolumny lub rekordu w widoku:
-
current_user()
: zwraca adres e-mail bieżącego użytkownika. -
is_account_group_member()
: zwracaTRUE
wartość, jeśli bieżący użytkownik jest członkiem określonej grupy na poziomie konta. Zalecane do użycia w dynamicznych widokach związanych z danymi Katalogu Unity. -
is_member()
: zwracaTRUE
wartość, jeśli bieżący użytkownik jest członkiem określonej grupy na poziomie obszaru roboczego. Ta funkcja jest udostępniana pod kątem zgodności z istniejącym magazynem metadanych Hive. Unikaj używania ich w kontekście danych Unity Catalog, ponieważ nie oceniają członkostwa w grupach na poziomie konta.
Usługa Azure Databricks zaleca, aby użytkownicy nie udzielali użytkownikom możliwości odczytywania tabel i widoków, do których odwołuje się widok.
Poniższe przykłady ilustrują tworzenie widoków dynamicznych w katalogu Unity.
Zanim rozpoczniesz
Aby utworzyć lub odczytać widoki dynamiczne, wymagania są takie same jak dla widoków standardowych, z wyjątkiem wymagań obliczeniowych. Należy użyć jednego z następujących zasobów obliczeniowych:
- Usługa SQL Warehouse.
- Środowisko obliczeniowe z trybem dostępu współdzielonego.
- Środowisko obliczeniowe z trybem dostępu pojedynczego użytkownika w środowisku Databricks Runtime 15.4 LTS lub nowszym.
Nie można odczytać widoków dynamicznych przy użyciu obliczeń pojedynczego użytkownika w środowisku Databricks Runtime 15.3 lub nowszym.
Aby skorzystać z filtrowania danych dostępnego w środowisku Databricks Runtime 15.4 LTS lub nowszym, należy również sprawdzić, czy obszar roboczy jest włączony dla bezserwerowychobliczeniowych, ponieważ funkcja filtrowania danych, która obsługuje widoki dynamiczne, działa na bezserwerowych obliczeniach. W związku z tym mogą być naliczane opłaty za zasoby obliczeniowe bezserwerowe w przypadku korzystania z obliczeń pojedynczego użytkownika do odczytywania widoków dynamicznych. Zobacz Szczegółowa kontrola dostępu w obliczeniach pojedynczego użytkownika.
Uprawnienia na poziomie kolumny
W widoku dynamicznym można ograniczyć kolumny, do których może uzyskać dostęp określony użytkownik lub grupa. W poniższym przykładzie tylko członkowie grupy auditors
mogą uzyskiwać dostęp do adresów e-mail z tabeli sales_raw
. Podczas analizy zapytań platforma Apache Spark zastępuje instrukcję CASE
ciągiem literału REDACTED
lub rzeczywistą zawartością kolumny adresu e-mail. Inne kolumny są zwracane normalnie. Ta strategia nie ma negatywnego wpływu na wydajność zapytań.
-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE WHEN
is_account_group_member('auditors') THEN email
ELSE 'REDACTED'
END AS email,
country,
product,
total
FROM sales_raw
Uprawnienia na poziomie wiersza
W widoku dynamicznym można określić uprawnienia na poziomie wiersza lub pola. W poniższym przykładzie tylko członkowie managers
grupy mogą wyświetlać kwoty transakcji, gdy przekraczają 1000 000 USD. Pasujące wyniki są filtrowane dla innych użytkowników.
CREATE VIEW sales_redacted AS
SELECT
user_id,
country,
product,
total
FROM sales_raw
WHERE
CASE
WHEN is_account_group_member('managers') THEN TRUE
ELSE total <= 1000000
END;
Maskowanie danych
Ponieważ widoki w Unity Catalog używają języka Spark SQL, można zaimplementować zaawansowane maskowanie danych, stosując bardziej złożone wyrażenia SQL i wyrażenia regularne. W poniższym przykładzie wszyscy użytkownicy mogą analizować domeny poczty e-mail, ale tylko członkowie auditors
grupy mogą wyświetlać cały adres e-mail użytkownika.
-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name.
CREATE VIEW sales_redacted AS
SELECT
user_id,
region,
CASE
WHEN is_account_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END
FROM sales_raw