MOC — dny 1 a 2
1. Představení Azure Databricks 2. Výběr a konfigurace compute 3. Objekty v Unity Catalogu 4. Zabezpečení Unity Catalogu 5. Governance Unity Catalogu 6. Datové modelování 7. Ingest dat
MOC — pokračování
8. Čištění a transformace dat 9. Data quality constraints · mimo osnovu 10. Datové pipelines 11. Lakeflow Jobs 12. Vývojový lifecycle · mimo osnovu 13. Monitoring a optimalizace
🏠 Rozcestník kurzu
Pod čarou — den 3
14. Průřez Microsoft Fabric 15. Power BI + Fabric + Databricks 16. Migrace z Oracle
🏠 Rozcestník kurzu
DP-750 · Kapitola 5

Governance objektů Unity Catalogu

Tagy a ABAC, retence a VACUUM, lineage, audit logging a Delta Sharing
🗂 Zabezpečení a governance

Cíle kapitoly

  • Vytvářet a udržovat dokumentaci tabulek pomocí komentářů a tagů pro data discovery.
  • Nakonfigurovat attribute-based access control (ABAC) s governed tagy a centrálními policies.
  • Nastavit retenční politiky Delta tabulek, bezpečně spouštět VACUUM a automatizovat údržbu přes predictive optimization.
  • Sledovat data lineage a auditní události přes Catalog Explorer a system tables.
  • Navrhnout bezpečnou Delta Sharing strategii pro sdílení dat mimo organizaci.
5.1

Table definitions: komentáře, tagy a discovery

Governance nezačíná u oprávnění, ale u metadat. Dobře popsané tabulky a sloupce jsou to, co odděluje důvěryhodný data estate od skládky parquet souborů — a s nástupem AI-driven discovery nástrojů (např. AI/BI Genie) platí přímá úměra: kvalita komentářů a tagů určuje kvalitu odpovědí, které nad vašimi daty AI vygeneruje.

Komentáře jsou volný popisný text — lze je přidat na katalog, schema, tabulku, view i jednotlivé sloupce, a to už při vytvoření tabulky nebo dodatečně. Podporují i markdown:

SQL
-- komentare primo v definici tabulky
CREATE TABLE sales.customers.profiles (
    customer_id  BIGINT COMMENT 'Unique identifier for each customer',
    email        STRING COMMENT 'Customer primary email address',
    created_date DATE   COMMENT 'Date when customer account was created'
);

-- dodatecne pridani / uprava komentare
COMMENT ON TABLE sales.customers.profiles
IS 'Contains customer profile information including contact details';

ALTER TABLE sales.customers.profiles
ALTER COLUMN email COMMENT 'Primary email address used for notifications';

Tagy jsou key-value páry pro strukturovanou klasifikaci — na rozdíl od komentářů se podle nich dá vyhledávat a stavět na nich politiky:

SQL
-- tagy na tabulce a na sloupci
ALTER TABLE sales.customers.profiles
SET TAGS ('domain' = 'sales', 'data_classification' = 'internal');

ALTER TABLE sales.customers.profiles
ALTER COLUMN email
SET TAGS ('pii' = 'email', 'sensitivity' = 'high');

-- odebrani tagu
ALTER TABLE sales.customers.profiles UNSET TAGS ('domain');

Limity: max. 50 tagů na objekt, 1 000 column tagů na tabulku, klíč i hodnota max. 256 znaků; klíče jsou case-sensitive. A protože se tagy ukládají jako plain text, nikdy do nich nedávejte citlivé hodnoty.

K průzkumu slouží Catalog Explorer (záložky Columns, Sample Data, Details, History, Insights) nebo SQL:

SQL
SHOW CATALOGS;
SHOW SCHEMAS IN sales;
SHOW TABLES IN sales.customers LIKE 'profiles_*';
DESCRIBE TABLE EXTENDED sales.customers.profiles;
SHOW TBLPROPERTIES sales.customers.profiles;
💡
Tip: Catalog Explorer umí komentáře generovat pomocí AI (tlačítko AI generate). Návrhy ale vždy zkontrolujte — vznikají analýzou schématu a názvů sloupců a mohou být nepřesné. Nespoléhejte na ně při klasifikaci PII.
ℹ️
Poznámka: k editaci komentářů potřebujete ownership objektu, nebo MODIFY + SELECT na tabulce (plus USE CATALOG / USE SCHEMA na rodičích). Číst je může každý s privilegiem BROWSE.
5.2

ABAC: governed tagy a centrální policies

Row filtry a masky z kapitoly 4 (sekce 4.4) mají jednu slabinu: konfigurují se tabulku po tabulce. Attribute-based access control (ABAC) tento problém obrací — místo oprávnění pro každou kombinaci tabulka × uživatel definujete policy navázanou na tag. Otagujete-li novou tabulku, politika se na ni aplikuje automaticky, bez další konfigurace.

Základem jsou governed tagy — na rozdíl od standardních tagů mají centrálně definované klíče a povolené hodnoty a přiřazovat je smí jen uživatelé s oprávněním ASSIGN:

AspektStandardní tagyGoverned tagy
Rozsahlibovolný key-value párpředdefinované klíče a hodnoty
Kontrolakdokoli s APPLY TAGjen uživatelé s ASSIGN
Účelorganizace a discoveryvynucování politik, compliance
Indikátor v UI—ikona zámku v Catalog Exploreru

Governed tag vytvoříte v UI: Catalog → Governance → Governed Tags — např. klíč pii s povolenými hodnotami ssn, email, address. Tagy na katalogu a schématu se dědí na všechny objekty uvnitř; tagy na sloupcích se nedědí.

Policy pak spojuje UDF funkci, cílovou skupinu a podmínku na tag:

SQL
-- maskovaci funkce (deterministicka, bez externich volani)
CREATE OR REPLACE FUNCTION mask_ssn(ssn STRING)
RETURNS STRING
DETERMINISTIC
RETURN '***-**-****';

-- centralni policy: maskuj kazdy sloupec s tagem pii=ssn v celem schematu
CREATE POLICY mask_sensitive_ssn
ON SCHEMA sales.customers
COLUMN MASK mask_ssn
TO `all_users`
EXCEPT `compliance_team`
FOR TABLES
MATCH COLUMNS
    has_tag_value('pii', 'ssn') AS ssn_col
ON COLUMN ssn_col;

Analogicky funguje ROW FILTER policy na úrovni katalogu či schématu — jeden příkaz pokryje všechny tabulky, které mají sloupec s daným tagem. Policies se dědí: politika na katalogu platí pro všechna schémata a tabulky uvnitř. Na jednu tabulku se smí uplatnit jen jeden row filter a na sloupec jedna maska — kolize policies vede k zablokování přístupu s chybou.

⚠️
Pozor: UDF v ABAC policy běží při každém dotazu na chráněné tabulky. Držte logiku jednoduchou a deterministickou, bez subquery, joinů a volání is_account_group_member() uvnitř funkce — rozhodnutí „pro koho" patří do policy (TO/EXCEPT), funkce řeší jen „jak transformovat". Výkon otestujte aspoň na milionu řádků.
ℹ️
Poznámka: pro přístup k tabulkám chráněným ABAC je podle dokumentace potřeba Databricks Runtime 16.4+ nebo serverless compute. Kvóty: 100 policies na katalog i schema, 50 na tabulku, 10 000 na metastore. ABAC row filter a column mask policies, governed tagy i automatická data classification jsou v Unity Catalogu generally available (od dubna 2026); kvóty a detaily chování ověřte v dokumentaci.
✓
Shrnutí: per-table filtry a masky (kapitola 4) pro jednotlivé výjimky; ABAC pro plošná pravidla typu „všechna PII pole maskovat všem kromě compliance". Otagování nové tabulky ji okamžitě dostane pod existující ochranu.
5.3

Retenční politiky: Delta retention, VACUUM a predictive optimization

Delta Lake si uchovává historii — transakční log a staré verze datových souborů. To umožňuje time travel, ale také to znamená, že smazaná data fyzicky nezmizí, dokud je neodstraní VACUUM. Retenci řídí dvě vlastnosti tabulky:

VlastnostVýchozí hodnotaÚčel
delta.logRetentionDuration30 dníjak dlouho se drží historie transakčního logu
delta.deletedFileRetentionDuration7 dníod kdy smí VACUUM odstranit nereferencované soubory
čas → dnes v12 v13 v14 v15 aktuální verze okno time travel — delta.logRetentionDuration (default 30 dní) starší než práh VACUUM trvale maže nereferencované soubory starší než deletedFileRetentionDuration (7 dní) Predictive optimization automaticky spouští VACUUM + OPTIMIZE + ANALYZE pro managed tabulky — bez ručního plánování
Životní cyklus dat Delta tabulky: retenční vlastnosti vymezují okno time travel, VACUUM trvale odstraňuje soubory za prahem a predictive optimization celou údržbu automatizuje.

Obě vlastnosti pracují společně — chcete-li 30 dní historie i u tabulek s častým VACUUM, nastavte obě:

SQL
ALTER TABLE sales.customers.transactions
SET TBLPROPERTIES (
    'delta.logRetentionDuration' = 'interval 30 days',
    'delta.deletedFileRetentionDuration' = 'interval 30 days'
);

-- VACUUM: default prah 7 dni, nebo explicitne
VACUUM sales.customers.transactions;
VACUUM sales.customers.transactions RETAIN 168 HOURS;
⚠️
Pozor: po VACUUM přestanou fungovat time travel dotazy na odstraněné verze — data fyzicky neexistují. A u tabulek se zapnutými deletion vectors samotný VACUUM nestačí: řádky označené k smazání odstraní až REORG TABLE … APPLY (PURGE).

Retence úzce souvisí s GDPR „právem být zapomenut": DELETE záznam pouze označí v nové verzi tabulky, fyzické odstranění zajistí až VACUUM. Mazání navíc musíte propagovat vrstvami medallionu — materialized views se srovnají při refreshi, ale streaming tables očekávají append-only zdroj a upstream delete je rozbije; řešením je skipChangeCommits:

PYTHON
# stream ignoruje upstream delety a updaty
spark.readStream.option('skipChangeCommits', 'true').table("bronze.users")

Ruční plánování VACUUM/OPTIMIZE přes stovky tabulek je přesně ta práce, kterou nechcete dělat. Predictive optimization ji pro managed tabulky automatizuje — spouští VACUUM, OPTIMIZE i ANALYZE podle skutečného využití tabulek:

SQL
ALTER SCHEMA sales.customers ENABLE PREDICTIVE OPTIMIZATION;

-- monitoring probehle udrzby vcetne nakladu
SELECT * FROM system.storage.predictive_optimization_operations_history;
💡
Tip: než predictive optimization zapnete, nastavte na tabulkách s delšími compliance požadavky delta.deletedFileRetentionDuration — automatický VACUUM jinak pojede s výchozími 7 dny. U účtů založených po 11. listopadu 2024 je predictive optimization zapnutá by default.
Archivace do cool/archive tieru: na co si dát pozor▼

Delta retenci lze doplnit Azure Storage lifecycle policies (přesun starých blobů do cool/archive tieru). Háček: operace jako UPDATE, MERGE nebo OPTIMIZE přepisují parquet soubory, čímž resetují jejich creation time a archivaci odkládají. Dotaz na soubor v offline archive tieru navíc selže, dokud se soubor neobnoví.

Doporučená strategie: partitionujte podle data, nastavte delta.timeUntilArchived tak, aby odpovídal lifecycle pravidlům, přístup ke „starým" datům omezte view s datumovým filtrem a maintenance příkazy spouštějte s predikáty (OPTIMIZE … WHERE ingestion_date >= …), aby se nedotýkaly archivovaných partitions.

5.4

Data lineage: odkud data tečou a kam

Unity Catalog zachytává runtime data lineage automaticky — pro všechny jazyky, až na úroveň sloupců, včetně vazeb na notebooky, joby a dashboardy. Nemusíte nic instrumentovat: stačí, aby dotazy běžely na Unity Catalog-enabled compute a tabulky se referencovaly třívrstvým jménem catalog.schema.table (přístup přes přímou cestu k souborům lineage negeneruje).

raw telemetrie volume / soubory bronze.vehicle_telemetry speed silver.telemetry_clean speed gold.fleet_daily avg_speed Dashboard downstream Job downstream column-level lineage: speed → avg_speed Lineage graf (Catalog Explorer → záložka Lineage → See Lineage Graph) zachytává se automaticky na UC-enabled compute, napříč workspaces sdílejícími metastore
Lineage graf sleduje tok dat od raw souborů přes vrstvy medallionu až po dashboardy a joby — včetně vazeb mezi jednotlivými sloupci.

V Catalog Exploreru otevřete u tabulky záložku Lineage a tlačítkem See Lineage Graph interaktivní vizualizaci: uzly jsou tabulky, šipky směr toku, ikonou + rozbalujete další úrovně upstream/downstream. Kliknutím na hranu zobrazíte, který notebook či job vazbu vytvořil; záložky Jobs a Dashboards ukážou konzumenty tabulky — ideální pro impact analysis před změnou schématu.

Pro reporting slouží dvě system tables:

SQL
-- nejcasteji dotazovane tabulky za posledni tyden
SELECT
  source_table_full_name,
  COUNT(DISTINCT event_id) AS query_count
FROM system.access.table_lineage
WHERE event_date > CURRENT_DATE() - INTERVAL 7 DAYS
  AND source_table_full_name IS NOT NULL
GROUP BY source_table_full_name
ORDER BY query_count DESC
LIMIT 10;
ℹ️
Poznámka: system tables system.access.table_lineage a system.access.column_lineage drží klouzavé okno 1 rok; Catalog Explorer a lineage API uchovávají události zachycené po 1. září 2024 bez časového omezení. Historii verzí tabulky doplní DESCRIBE HISTORY.
⚠️
Pozor na limity: lineage se neuchovává při přejmenování objektu, tabulky čtené cestou (delta.`abfss://…`) se zobrazují jen jako cesta a některé UDF mohou column-level mapování zakrýt. Uzly, na které uživatel nemá aspoň BROWSE, se v grafu zobrazují maskované.
5.5

Audit logging přes system tables

Kdo, kdy a k čemu přistoupil — na to odpovídá audit log system table system.access.audit. Konfiguruje se na úrovni accountu, pokrývá všechny workspaces připojené k metastoru a z compliance šetření dělá obyčejný SQL dotaz místo prohledávání log souborů.

Klíčové sloupce: event_time, user_identity, workspace_id (0 = account-level událost), service_name (např. unityCatalog, notebook, clusters), action_name (např. getTable, updatePermissions), request_params, response a source_ip_address.

SQL
-- kdo pristoupil ke konkretni tabulce za poslednich 7 dni
SELECT
  user_identity.email AS user_email,
  action_name AS access_type,
  event_time
FROM system.access.audit
WHERE request_params.full_name_arg = 'catalog.schema.table_name'
  AND action_name IN ('getTable', 'createTable', 'deleteTable')
  AND event_date > CURRENT_DATE() - INTERVAL 7 DAYS
ORDER BY event_time DESC;

-- audit zmen opravneni v metastoru
SELECT event_time, user_identity.email, request_params.securable_full_name, request_params.changes
FROM system.access.audit
WHERE service_name = 'unityCatalog' AND action_name = 'updatePermissions'
ORDER BY event_time DESC;
ℹ️
Poznámka: system tables musí nejprve povolit account admin; tabulka system.access.audit byla v době psaní modulu v Public Preview — aktuální stav ověřte v dokumentaci. Audit logy se uchovávají až 1 rok; delší retenci řešte exportem.

Výchozí logování nezachytává plný text spouštěných příkazů. Pro detailní forenzní stopu zapněte verbose audit logs (Admin Settings → Advanced) — přibudou události runCommand (notebooky, joby) a commandSubmit (Databricks SQL). Samotné zapnutí/vypnutí verbose logování je auditovaná událost.

⚠️
Pozor: verbose logy obsahují text příkazů — tedy potenciálně i parametry dotazů či natvrdo zapsané hodnoty. Počítejte s tím v bezpečnostních politikách.

Pro centrální monitoring lze logy přes Azure diagnostic settings doručovat do Log Analytics (KQL dotazy, dashboardy, typická latence ~15 minut), Storage accountu (levná dlouhodobá archivace) nebo Event Hubs (real-time streaming do SIEM). Kombinace „system table pro ad-hoc šetření + SIEM pro kontinuální monitoring" pokryje obě potřeby.

5.6

Návrh Delta Sharing strategie

Delta Sharing umožňuje sdílet živá data s partnery a jinými organizacemi bez kopírování — příjemce čte přímo z vašich dat, vy si držíte plnou kontrolu nad tím, kdo vidí co. Strategické rozhodnutí číslo jedna je volba protokolu:

FaktorDatabricks-to-DatabricksOpen sharing
Platforma příjemceDatabricks s Unity Catalogemlibovolná (pandas, Spark, BI…)
Autentizacespravovaná platformou (sharing identifier)bearer token nebo OIDC federace
Sdílené assetytabulky, views, volumes, notebooky, modelyjen tabulky
Správa tokenůnení potřebaexpirace + rotace nutná
Provider Unity Catalog metastore SHARE partner_analytics tabulky (i WITH HISTORY) dynamic views (filtrace) volumes, notebooky, modely GRANT SELECT → RECIPIENT Databricks-to-Databricks sharing identifier příjemce autentizace řeší platforma Open sharing bearer token / OIDC federace expirace, IP access lists Recipient: Databricks workspace s Unity Catalogem share jako katalog Recipient: jiná platforma pandas, Spark, Power BI… credential file z aktivace živá data bez kopírování — audit v system.access.audit
Delta Sharing: provider publikuje share, příjemci se připojují buď platformně spravovanou Databricks-to-Databricks cestou, nebo open sharing protokolem s tokenem či OIDC.

Share je securable objekt — kolekce sdílených assetů. Recipient reprezentuje příjemce. Celý životní cyklus zvládnete v SQL:

SQL
CREATE SHARE IF NOT EXISTS partner_analytics
COMMENT 'Sales analytics data for partner integration';

ALTER SHARE partner_analytics ADD TABLE catalog.schema.sales_summary;
ALTER SHARE partner_analytics ADD TABLE catalog.schema.transactions WITH HISTORY;

-- D2D recipient pres sharing identifier (prijemce jej zjisti: SELECT CURRENT_METASTORE())
CREATE RECIPIENT IF NOT EXISTS contoso_analytics
USING ID 'azure:westeurope:a1b2c3d4-e5f6-7890-abcd-ef1234567890';

GRANT SELECT ON SHARE partner_analytics TO RECIPIENT contoso_analytics;

-- prehled a odebirani
SHOW SHARES;
SHOW ALL IN SHARE partner_analytics;
REVOKE SELECT ON SHARE partner_analytics FROM RECIPIENT contoso_analytics;

Když různí příjemci mají vidět různé výseky dat, nesdílejte celou tabulku — použijte dynamic view s funkcí CURRENT_RECIPIENT() nad custom properties příjemce:

SQL
ALTER RECIPIENT regional_partner SET PROPERTIES ('country_region' = 'US');

CREATE VIEW catalog.schema.regional_sales AS
SELECT * FROM catalog.schema.all_sales
WHERE region = CURRENT_RECIPIENT('country_region');
💡
Tip: u open sharing nastavte expiraci tokenů na úrovni metastoru a citlivé shares omezte IP access listy (až 100 IP/CIDR hodnot na recipienta). Dlouhodobě lepší než rotace tokenů je OIDC federace — krátkodobé OAuth tokeny výměnou za JWT z identity providera příjemce.
⚠️
Pozor: sdílení celého schématu (ADD SCHEMA) automaticky zahrne i budoucí tabulky v něm. Pohodlné, ale nebezpečné — nová interní tabulka ve schématu odteče partnerovi bez dalšího schválení. Sdílejte jen nezbytné minimum.

Aktivitu sledujte v auditu: událost deltaSharingQueriedTable (open sharing) a generateTemporaryTableCredential (D2D). Zavedete-li měsíční revizi aktivních recipientů, kontrolu obsahu shares a sledování neúspěšných přístupů, máte governance smyčku uzavřenou. Delegujte správu přes specifická privilegia (CREATE SHARE, CREATE RECIPIENT, SET SHARE PERMISSION) skupinám data stewardů — ne plošným metastore adminům.

5.7

Lab 5: Govern Unity Catalog Objects (45 minut)

Automobilka AutoSphere AG buduje platformu pro connected vehicles: ingestuje telemetrii z milionů vozů a spravuje servisní záznamy. V labu vytvoříte tabulky vehicle_telemetry a service_records, opatříte je komentáři a PII tagy, nastavíte Delta retenci a spustíte VACUUM, prozkoumáte lineage graf v Catalog Exploreru a nakonec budete lineage i audit události dotazovat programově přes system tables.

▶ Otevřít lab na GitHubu (EN) · Learn modul k tématu — s krátkými výukovými videy

ℹ️
Poznámka: na kurzu lab prochází lektor jako demo. Postup je krokový a samoobslužný — pokud se na něj v rámci dne nedostane, projdete si ho samostatně.
✓
Sebekontrola: 1) Které dvě vlastnosti tabulky musíte nastavit, aby time travel spolehlivě fungoval 30 dní zpět, a co s okny historie udělá VACUUM? 2) Čím se governed tag liší od standardního a proč je předpokladem pro ABAC policies? 3) Ve které system table zjistíte, kdo v posledním týdnu četl tabulku vehicle_telemetry, a ve které její downstream závislosti?