Unity Catalog is Databricks’ unified governance layer for the lakehouse. Open-sourced in mid-2024 (Unity Catalog OSS, Apache 2.0), it has become the default multi-engine catalog on Databricks and Microsoft Fabric, with growing support for non-Databricks engines through the open APIs. Unity is broader than a table catalog — it governs tables, volumes (files), ML models, AI tools, and SQL functions in one namespace hierarchy.
The sections below explain the object hierarchy, how credential vending enforces access, worked SQL for grants, column masks and row filters, and how Unity Catalog compares with Polaris and Nessie.
catalog.schema.object — a clean break from the flat Hive Metastore. Catalogs map naturally to environments, business units, or regions.Unity Catalog runs as a metadata service backed by a relational store. Compute engines (Databricks clusters, Trino, Spark) authenticate to UC, request access, and receive scoped cloud credentials and metadata pointers. Object storage paths are abstracted by external locations and storage credentials, so end users see logical names, not S3 ARNs.
Unity Catalog organises every governed object as catalog.schema.object under a metastore. On Databricks the metastore is regional and shared by the workspaces attached to it, so the same table name and permissions apply in every workspace. Objects include managed and external tables, views, volumes (governed directories of files such as PDFs or images), registered ML models and SQL or Python functions. Privileges such as USE CATALOG, USE SCHEMA, SELECT and MODIFY are inherited downward, so granting on a schema covers its tables.
Engines never hold long-lived storage keys. An engine asks Unity Catalog for a table; Unity Catalog checks the caller's privileges, records the access for audit and lineage, and returns the table's location with short-lived, path-scoped cloud credentials. The engine reads the files directly from object storage. Row filters and column masks are enforced by trusted Databricks compute; external engines reading through the open APIs receive credentials only for tables they may read in full, so fine-grained policies require compute that understands them.
CREATE CATALOG IF NOT EXISTS prod;
CREATE SCHEMA IF NOT EXISTS prod.sales;
CREATE TABLE prod.sales.orders (
order_id BIGINT, customer_email STRING, region STRING, amount DECIMAL(12,2)
);
-- analysts can read the schema
GRANT USE CATALOG ON CATALOG prod TO `analysts`;
GRANT USE SCHEMA, SELECT ON SCHEMA prod.sales TO `analysts`;
-- mask email for everyone outside the support group
CREATE FUNCTION prod.sales.mask_email(e STRING) RETURN
CASE WHEN is_account_group_member('support') THEN e ELSE '***' END;
ALTER TABLE prod.sales.orders ALTER COLUMN customer_email SET MASK prod.sales.mask_email;
-- restrict rows by region
CREATE FUNCTION prod.sales.emea_only(r STRING) RETURN
is_account_group_member('emea') OR r <> 'EMEA';
ALTER TABLE prod.sales.orders SET ROW FILTER prod.sales.emea_only ON (region);
-- audit who can do what
SHOW GRANTS ON TABLE prod.sales.orders;
The row-filter function here hides EMEA rows from anyone outside the emea group. Lineage needs no code: queries run on Unity Catalog-enabled compute are recorded automatically and appear as table- and column-level graphs in the catalog explorer and system tables.
| Requirement | Unity Catalog | Alternative |
|---|---|---|
| Databricks-centred platform | Default choice | — |
| Iceberg-only, engine-neutral catalog | Possible via Iceberg REST | Apache Polaris |
| Git-style branching of table state | Not its model | Project Nessie |
| Governance of files, models and functions alongside tables | Strong | Separate tools per asset type |
ALL PRIVILEGES on a catalog is easy and hard to audit; prefer group-based, schema-level grants.See the Catalogs overview, Delta Lake and Apache Iceberg for the table formats it governs, and Trino as an external engine.