Sdílet prostřednictvím


Filtrování citlivých dat tabulky pomocí filtrů řádků a masek sloupců

Důležité

Tato funkce je ve verzi Public Preview.

Tento článek obsahuje pokyny a příklady použití filtrů řádků, masek sloupců a mapování tabulek pro filtrování citlivých dat v tabulkách. Tyto funkce vyžadují katalog Unity.

Co jsou filtry řádků?

Filtry řádků umožňují použít filtr na tabulku, aby dotazy vracely pouze řádky, které splňují kritéria filtru. Filtr řádků implementujete jako uživatelem definovanou funkci SQL (UDF). Podporují se také funkce Definované uživatelem Pythonu a Scala, ale jenom v případě, že jsou zabalené v uživatelem definovaných funkcích SQL.

Co jsou masky sloupců?

Masky sloupců umožňují použít funkci maskování u sloupce tabulky. Funkce maskování se vyhodnocuje za běhu dotazu a každý odkaz cílového sloupce nahraďe výsledky funkce maskování. Ve většině případů masky sloupců určují, jestli se má vrátit původní hodnota sloupce, nebo ji znovu provést na základě identity vyvolání uživatele. Masky sloupců jsou výrazy napsané jako uživatelem definované uživatelem SQL nebo jako uživatelem definované uživatelem Pythonu nebo Scala, které jsou zabalené v uživatelem definovaných funkcích SQL.

Každý sloupec tabulky může mít použitou jenom jednu maskovací funkci. Funkce maskování přebírá nemaskovanou hodnotu sloupce jako vstup a jako výsledek vrátí maskovanou hodnotu. Návratová hodnota funkce maskování by měla být stejného typu jako maskovaný sloupec. Funkce maskování může také jako vstupní parametry přijímat další sloupce a používat je v logice maskování.

Jaký je rozdíl mezi těmito filtry a dynamickými zobrazeními?

Dynamická zobrazení, filtry řádků a masky sloupců umožňují použít komplexní logiku u tabulek a zpracovávat jejich rozhodnutí o filtrování za běhu dotazu.

Dynamické zobrazení je abstraktní zobrazení jen pro čtení jedné nebo více zdrojových tabulek. Uživatel má přístup k dynamickému zobrazení bez přímého přístupu ke zdrojovým tabulkám. Vytvoření dynamického zobrazení definuje nový název tabulky, který se nesmí shodovat s názvem žádných zdrojových tabulek nebo jiných tabulek a zobrazení, které jsou přítomné ve stejném schématu.

Na druhou stranu přidružení filtru řádku nebo masky sloupců k cílové tabulce použije odpovídající logiku přímo na samotnou tabulku bez zavedení nových názvů tabulek. Další dotazy můžou dál odkazovat přímo na cílovou tabulku s použitím původního názvu.

Dynamická zobrazení použijte, pokud potřebujete použít logiku transformace, jako jsou filtry a masky u tabulek jen pro čtení, a pokud je pro uživatele přijatelné odkazovat na dynamická zobrazení pomocí různých názvů. Pokud chcete data filtrovat při sdílení pomocí rozdílového sdílení, musíte použít dynamická zobrazení. Filtry řádků a masky sloupců použijte, pokud chcete filtrovat nebo vypočítat výrazy nad konkrétními daty, ale přesto uživatelům poskytnout přístup k tabulkám pomocí jejich původních názvů.

Než začnete

Pokud chcete do tabulek přidat filtry řádků a masky sloupců, musíte mít:

  • Pracovní prostor, který je povolený pro katalog Unity.
  • Funkce zaregistrovaná v katalogu Unity. Může to být UDF SQL nebo Python nebo Scala UDF, který je zaregistrovaný v katalogu Unity a zabalený v UDF SQL. Podrobnosti najdete v tématu Co jsou uživatelem definované funkce (UDF)?, klauzule Maska sloupce a klauzule ROW FILTER.

Musíte také splnit následující požadavky:

  • Pokud chcete přiřadit funkci, která přidává filtry řádků nebo masky sloupců do tabulky, musíte mít EXECUTE oprávnění k funkci, USE SCHEMA schématu a USE CATALOG nadřazeného katalogu.
  • Pokud chcete přidat filtry nebo masky při vytváření nové tabulky, musíte mít CREATE TABLE také oprávnění ke schématu.
  • Pokud chcete přidat filtry nebo masky změnou existující tabulky, musíte být také vlastníkem tabulky nebo mít MODIFY oprávnění k tabulce.

Pokud chcete získat přístup k tabulce, která obsahuje filtry řádků nebo masky sloupců, musí výpočetní prostředek splňovat tyto požadavky:

  • Cluster režimu sdíleného přístupu v Databricks Runtime 12.2 LTS nebo novější nebo SQL Warehouse.

Použití filtru řádků

Pokud chcete vytvořit filtr řádků, napíšete funkci (UDF), která definuje zásadu filtru a použije ji u tabulky. Každá tabulka může mít pouze jeden filtr řádků. Filtr řádku přijímá nula nebo více vstupních parametrů, kde každý vstupní parametr vytvoří vazbu na jeden sloupec odpovídající tabulky.

Filtr řádků můžete použít pomocí Průzkumníka katalogu nebo příkazů SQL. Pokyny průzkumníka katalogu předpokládají, že jste už vytvořili funkci a že je zaregistrovaná v katalogu Unity. Pokyny SQL zahrnují příklady vytvoření funkce filtru řádků a použití na tabulku.

Průzkumník katalogu

  1. V pracovním prostoru Azure Databricks klikněte na Ikona katalogu Katalog.
  2. Vyhledejte nebo vyhledejte tabulku, kterou chcete filtrovat.
  3. Na kartě Přehled klikněte na filtr řádků: Přidat filtr.
  4. V dialogovém okně Přidat filtr řádků vyberte katalog a schéma, které obsahují funkci filtru, a pak tuto funkci vyberte.
  5. V rozšířeném dialogovém okně zobrazte definici funkce a vyberte sloupce tabulky, které odpovídají sloupcům obsaženým v příkazu funkce.
  6. Klikněte na tlačítko Přidat.

Pokud chcete filtr z tabulky odebrat, klikněte na fx Row filter a klikněte na Odebrat.

SQL

Pokud chcete vytvořit filtr řádků a pak ho přidat do existující tabulky, použijte CREATE FUNCTION a použijte funkci pomocí ALTER TABLE. Funkci můžete použít také při vytváření tabulky pomocí CREATE TABLE.

  1. Vytvořte filtr řádků:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {filter clause whose output must be a boolean};
    
  2. Použijte filtr řádků u tabulky pomocí názvu sloupce:

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

Další příklady syntaxe:

  • Odebrání filtru řádků z tabulky:

    ALTER TABLE <table_name> DROP ROW FILTER;
    
  • Úprava filtru řádků:

    Run a DROP FUNCTION statement to drop the existing function, or use CREATE OR REPLACE FUNCTION to replace it.
    
  • Odstranění filtru řádků:

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

    Poznámka:

    Před uvolněním funkce je nutné provést ALTER TABLE ... DROP ROW FILTER příkaz. Pokud ne, bude tabulka nepřístupná.

    Pokud je tabulka tímto způsobem nepřístupná, upravte tabulku a odstraňte odkaz na osamocený řádek pomocí ALTER TABLE <table_name> DROP ROW FILTER;.

Viz také klauzule ROW FILTER.

Příklady filtru řádků

Tento příklad vytvoří uživatelem definovanou funkci SQL, která se vztahuje na členy skupiny admin v oblasti US.

Když se tato ukázková funkce použije na sales tabulku, členové admin skupiny budou mít přístup ke všem záznamům v tabulce. Pokud funkci volá nesprávce, podmínka selže a region='US' výraz se vyhodnotí a vyfiltruje se tabulka tak, RETURN_IF aby zobrazovala jenom záznamy v US oblasti.

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

Použijte funkci u tabulky jako filtru řádků. Následné dotazy z sales tabulky pak vrátí podmnožinu řádků.

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

Zakažte filtr řádků. Budoucí dotazy uživatelů z sales tabulky pak vrátí všechny řádky v tabulce.

ALTER TABLE sales DROP ROW FILTER;

Vytvořte tabulku s funkcí použitou jako filtr řádků jako součást CREATE TABLE příkazu. Budoucí dotazy z sales tabulky pak vrátí podmnožinu řádků.

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

Použití masky sloupce

Pokud chcete použít masku sloupce, vytvořte funkci (UDF) a pak ji použijte u sloupce tabulky.

Masku sloupce můžete použít pomocí Průzkumníka katalogu nebo příkazů SQL. Pokyny průzkumníka katalogu předpokládají, že jste už vytvořili funkci a že je zaregistrovaná v katalogu Unity. Pokyny SQL zahrnují příklady vytvoření funkce masky sloupce a použití na sloupec tabulky.

Průzkumník katalogu

  1. V pracovním prostoru Azure Databricks klikněte na Ikona katalogu Katalog.
  2. Vyhledejte tabulku nebo ji vyhledejte.
  3. Na kartě Přehled najděte řádek, u kterého chcete použít masku sloupce, a klikněte na Ikona Upravit ikonu Maska pro úpravy.
  4. V dialogovém okně Přidat masku sloupce vyberte katalog a schéma, které obsahují funkci filtru, a pak tuto funkci vyberte.
  5. V rozbaleném dialogovém okně zobrazte definici funkce. Pokud funkce kromě maskovaného sloupce obsahuje všechny parametry, vyberte sloupce tabulky, na které chcete přetypovat tyto další parametry funkce.
  6. Klikněte na tlačítko Přidat.

Chcete-li z tabulky odebrat masku sloupce, klikněte na fx Maska sloupce v řádku tabulky a klepněte na tlačítko Odebrat.

SQL

Pokud chcete vytvořit masku sloupce a přidat ji do existujícího sloupce tabulky, použijte CREATE FUNCTION a použijte funkci maskování pomocí ALTER TABLE. Funkci můžete použít také při vytváření tabulky pomocí CREATE TABLE.

Slouží SET MASK k použití funkce maskování. MASK V rámci této klauzule můžete použít některou z integrovaných funkcí modulu runtime Azure Databricks nebo volat jiné uživatelem definované funkce. Mezi běžné případy použití patří kontrola identity vyvolání uživatele, který funkci spouští, pomocí current_user( ) nebo získání skupin, které jsou členy používání is_account_group_member( ). Podrobnosti najdete v tématu Maska sloupce klauzule a předdefinované funkce.

  1. Vytvoření masky sloupce:

    CREATE FUNCTION <function_name> (<parameter_name> <parameter_type>, ...)
    RETURN {expression with the same type as the first parameter};
    
  2. Použijte masku sloupce u sloupce v existující tabulce:

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

Další příklady syntaxe:

  • Odebrání masky sloupce ze sloupce v tabulce:

    ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;
    
  • Úprava masky sloupce: Buď DROP existující funkce, nebo použijte CREATE OR REPLACE TABLE.

  • Odstranění masky sloupce:

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

    Poznámka:

    Před vyřazením funkce je nutné provést ALTER TABLE příkaz nebo tabulka bude nepřístupná.

    Pokud je tabulka tímto způsobem nepřístupná, upravte tabulku a odstraňte odkaz na osamocené masky pomocí ALTER TABLE <table_name> ALTER COLUMN <column where mask is applied> DROP MASK;.

Příklady masky sloupců

V tomto příkladu vytvoříte uživatelem definovanou funkci, která zamaskuje ssn sloupec tak, aby hodnoty v tomto sloupci mohli zobrazit jenom uživatelé, kteří jsou členy HumanResourceDept skupiny.

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

Použijte novou funkci na tabulku jako masku sloupce. Masku sloupce můžete přidat při vytváření tabulky nebo za.

--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;

Dotazy na tuto tabulku teď vracejí maskované ssn hodnoty sloupců, když uživatel dotazu není členem HumanResourceDept skupiny:

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

Zakázání masky sloupce tak, aby dotazy vrátily původní hodnoty ve sloupci ssn :

ALTER TABLE users ALTER COLUMN ssn DROP MASK;

Vytvoření seznamu řízení přístupu pomocí mapovacích tabulek

Pokud chcete dosáhnout zabezpečení na úrovni řádků, zvažte definování tabulky mapování (nebo seznamu řízení přístupu). Každá tabulka mapování je komplexní mapovací tabulka, která kóduje řádky dat v původní tabulce, které jsou přístupné určitým uživatelům nebo skupinám. Mapování tabulek je užitečné, protože nabízejí jednoduchou integraci s tabulkami faktů prostřednictvím přímých spojení.

Tato metodologie je přínosná při řešení mnoha případů použití s vlastními požadavky. Příkladem může být:

  • Nastavení omezení na základě přihlášeného uživatele při současném přizpůsobení různých pravidel pro konkrétní skupiny uživatelů.
  • Vytváření složitých hierarchií, jako jsou organizační struktury, vyžadující různé sady pravidel
  • Replikace složitých modelů zabezpečení z externích zdrojových systémů

Přijetím mapovacích tabulek tímto způsobem můžete efektivně řešit tyto náročné scénáře a zajistit robustní implementace zabezpečení na úrovni řádků a sloupců.

Příklady mapovacích tabulek

Pomocí tabulky mapování zkontrolujte, jestli je aktuální uživatel v seznamu:

USE CATALOG main;

Vytvořte novou tabulku mapování:

DROP TABLE IF EXISTS valid_users;

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

Vytvořte nový filtr:

Poznámka:

Všechny filtry se spouští s právy defineru s výjimkou funkcí, které kontrolují kontext uživatele (například CURRENT_USER funkce), IS_MEMBER které se spouští jako invoker.

V tomto příkladu funkce zkontroluje, jestli je aktuální uživatel v valid_users tabulce. Pokud se uživatel najde, vrátí funkce hodnotu true.

DROP FUNCTION IF EXISTS row_filter;

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

Následující příklad použije filtr řádků během vytváření tabulky. Filtr můžete přidat také později pomocí ALTER TABLE příkazu. Při použití na celou tabulku použijte ON () syntaxi. Pro konkrétní řádek použijte 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);

Vyberte data z tabulky. Tato možnost by měla vracet data pouze v případě, že je uživatel v valid_users tabulce.

SELECT * FROM data_table;

Vytvořte tabulku mapování obsahující účty, které by vždy měly mít přístup k zobrazení všech řádků v tabulce bez ohledu na hodnoty sloupců:

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

Teď vytvořte UDF SQL, která se vrátí true , pokud jsou hodnoty všech sloupců v řádku menší než pět, nebo pokud je vyvolání uživatele členem výše uvedené tabulky mapování.

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));

Nakonec u tabulky jako filtr řádků použijte UDF SQL:

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

Podporované funkce a formáty

  • Podporují se poznámkové bloky DATAbricks SQL a Databricks pro úlohy SQL.

  • Podporují se příkazy DML uživatelů s oprávněními MODIFY . Filtry a masky se použijí na data přečtená pomocí UPDATE příkazů a DELETE nepoužívají se na zapsaná data (včetně INSERT).

  • Podporované formáty dat:

    • Delta a Parquet pro spravované a externí tabulky
    • Více dalších formátů dat pro cizí tabulky zaregistrované v katalogu Unity pomocí Lakehouse Federation
  • Funkce SQL, Python a Scala UDF se podporují jako funkce filtru řádků nebo masky sloupců, pokud jsou zaregistrované v katalogu Unity. Uživatelem definované funkce Pythonu a Scala musí být zabalené do uživatelem definovaného uživatelem SQL.

  • Podporují se zobrazení tabulek s maskami sloupců nebo filtry řádků.

  • Rozdílové datové kanály změn Delta Lake se podporují, pokud je schéma kompatibilní s filtry řádků a maskami sloupců, které platí pro cílovou tabulku.

  • MERGE Příkazy jsou podporovány, když zdrojové tabulky, cílové tabulky nebo obě používají filtry řádků a masky sloupců. To zahrnuje tabulky s funkcemi filtru řádků, které obsahují jednoduché poddotazy, ale existují omezení uvedená v následující části.

  • Databricks SQL materializovaná zobrazení a tabulky streamování Databricks SQL podporují filtry řádků a masky sloupců (Public Preview):

    • Filtry řádků a masky sloupců můžete přidat do materializovaného zobrazení Nebo tabulky streamování Databricks SQL.
    • Databricks SQL Materializovaná zobrazení nebo streamované tabulky můžete definovat u tabulek, které obsahují filtry řádků a masky sloupců.

Omezení

  • Verze Databricks Runtime nižší než 12.2 LTS nepodporují filtry řádků ani masky sloupců. Tyto moduly runtime bezpečně selžou, což znamená, že pokud se pokusíte získat přístup k tabulkám z nepodporovaných verzí těchto modulů runtime, nebudou vrácena žádná data.
  • Materializovaná zobrazení a streamované tabulky deklarované v rozdílových živých tabulkách nepodporují filtry řádků ani masky sloupců.
  • Rozdílové sdílení nefunguje se zabezpečením na úrovni řádků ani s maskami sloupců.
  • Časová cesta nefunguje se zabezpečením na úrovni řádků ani maskami sloupců.
  • Vzorkování tabulky nefunguje se zabezpečením na úrovni řádků ani maskami sloupců.
  • Přístup k souborům v tabulkách se zásadami není podporovaný.
  • Zásady filtrování řádků nebo masky sloupců s kruhovými závislostmi zpět k původním zásadám se nepodporují.
  • Hluboké a mělké klony nejsou podporovány.
  • MERGE Příkazy nepodporují tabulky se zásadami filtru řádků, které obsahují vnořené, agregace, okna, limity nebo ne deterministické funkce.
  • Rozhraní Delta Lake API se nepodporují.
  • SHOW CREATE TABLE v materializovaných zobrazeních a streamovaných tabulkách nezobrazuje informace o filtru řádků a maskách sloupců.

Omezení výpočetních prostředků s jedním uživatelem

Nepřidávejte filtry řádků ani masky sloupců do žádné tabulky, ke které přistupujete z clusteru s jedním uživatelem. To se běžně provádí v kontextu pracovních postupů (úloh). Během verze Public Preview nebudete mít přístup k tabulkám z jednoho uživatelského clusteru, pokud byl použit filtr nebo maska.