> ## Documentation Index
> Fetch the complete documentation index at: https://docs.streamnative.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Unity Catalog Managed Iceberg Table on Azure

This guide describes how to prepare a Databricks Unity Catalog for use with StreamNative Ursa as a managed Iceberg table catalog on Microsoft Azure.

## Prerequisites

* A Databricks workspace on Azure with Unity Catalog and Iceberg Managed Table enabled
* An Azure subscription with permissions to create storage accounts and Access Connectors

## 1. Create an Azure Storage Container

Create a storage container in your Azure Storage Account (for example, `unity-catalog-iceberg`). The container path will follow the format:

```
abfss://<container>@<storage-account>.dfs.core.windows.net
```

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-01.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=0fe7e545c2138432e7da22c9704b608b" alt="Create storage container" width="1920" height="1025" data-path="images/ursa-lakehouse/uc-iceberg-azure-01.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-02.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=6c4b3fc4d7b31d3ba975d301ed3d2348" alt="Storage container" width="1920" height="643" data-path="images/ursa-lakehouse/uc-iceberg-azure-02.webp" />

## 2. Create an Access Connector for Azure Databricks

Refer to the [Azure Databricks Managed Identities documentation](https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/azure-managed-identities) for the canonical procedure.

In the Azure Portal, create an **Access Connector for Azure Databricks**.

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-03.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=c1d4215bc764f4b7ca0a0b41ec4ea74f" alt="Access Connector" width="1920" height="949" data-path="images/ursa-lakehouse/uc-iceberg-azure-03.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-04.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=400289a3069bfae65cf0ed1d2d413c99" alt="Access Connector settings" width="1795" height="1920" data-path="images/ursa-lakehouse/uc-iceberg-azure-04.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-05.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=9ab3e0eb3a06d46bb711134b4560b362" alt="Access Connector created" width="1920" height="1868" data-path="images/ursa-lakehouse/uc-iceberg-azure-05.webp" />

Record the connector **Resource ID**, which has the form:

```
/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Databricks/accessConnectors/<connector-name>
```

## 3. Grant Storage Permissions to the Access Connector

The Access Connector identity requires the following roles:

| Scope           | Role                                      |
| --------------- | ----------------------------------------- |
| Storage Account | `Storage Blob Data Contributor`           |
| Storage Account | `Storage Queue Data Contributor`          |
| Resource Group  | `EventGrid EventSubscription Contributor` |

### 3.1 Grant `Storage Blob Data Contributor`

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-06.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=358818ba7b161d387e8b18d53b163149" alt="Grant Blob Data Contributor" width="1920" height="1056" data-path="images/ursa-lakehouse/uc-iceberg-azure-06.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-07.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=bc2316d664aa2e09d0935e5fe4e9f23e" alt="Grant Blob Data Contributor" width="1614" height="1920" data-path="images/ursa-lakehouse/uc-iceberg-azure-07.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-08.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=250bc3c808e83d391a97ba6c886d309e" alt="Grant Blob Data Contributor" width="1920" height="1065" data-path="images/ursa-lakehouse/uc-iceberg-azure-08.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-09.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=94ac5a36f1f8f542503e969d15dc8b9c" alt="Grant Blob Data Contributor" width="1920" height="1328" data-path="images/ursa-lakehouse/uc-iceberg-azure-09.webp" />

### 3.2 Grant `Storage Queue Data Contributor`

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-10.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=6c7989e05893cf28514f35bc92ccf692" alt="Grant Queue Data Contributor" width="1920" height="1012" data-path="images/ursa-lakehouse/uc-iceberg-azure-10.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-11.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=d0b0a81fef174a6ac19785e60104eb64" alt="Grant Queue Data Contributor" width="1920" height="1066" data-path="images/ursa-lakehouse/uc-iceberg-azure-11.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-12.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=d93298521b9316d6e0a12d33adaed966" alt="Grant Queue Data Contributor" width="1920" height="1320" data-path="images/ursa-lakehouse/uc-iceberg-azure-12.webp" />

### 3.3 Grant `EventGrid EventSubscription Contributor`

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-13.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=44de2356faeda1cdcdfb772cf44a430c" alt="Grant EventGrid Contributor" width="1920" height="769" data-path="images/ursa-lakehouse/uc-iceberg-azure-13.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-14.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=d94af5e3280a14ecff001f5e6351a061" alt="Grant EventGrid Contributor" width="1920" height="1055" data-path="images/ursa-lakehouse/uc-iceberg-azure-14.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-15.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=42d5c45788824f41e8e9440efd9710ac" alt="Grant EventGrid Contributor" width="1920" height="1065" data-path="images/ursa-lakehouse/uc-iceberg-azure-15.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-16.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=e918eab2177b9c77330ada22da1eb2c7" alt="Grant EventGrid Contributor" width="1920" height="1141" data-path="images/ursa-lakehouse/uc-iceberg-azure-16.webp" />

## 4. Create the Unity Catalog Metastore

Create the Unity Catalog metastore in Databricks.

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-17.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=27d292af05868bbc224e749460570d56" alt="Create metastore" width="1920" height="526" data-path="images/ursa-lakehouse/uc-iceberg-azure-17.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-18.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=d991944e3c5ea3cb4ec3fa4181837f5e" alt="Metastore configuration" width="1872" height="1920" data-path="images/ursa-lakehouse/uc-iceberg-azure-18.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-19.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=bc2ed0cc7330d07832c9614b573a4f78" alt="Metastore created" width="1920" height="1042" data-path="images/ursa-lakehouse/uc-iceberg-azure-19.webp" />

## 5. Create a Storage Credential

In the Databricks Catalog console, create a storage credential linked to the Access Connector created in step 2.

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-20.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=3865b0ed65105b4bc3ba87db78e681ec" alt="Create credential" width="1920" height="810" data-path="images/ursa-lakehouse/uc-iceberg-azure-20.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-21.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=9a3e3b5384f4ac1a1f648a1cf59d9e60" alt="Credential form" width="1920" height="981" data-path="images/ursa-lakehouse/uc-iceberg-azure-21.webp" />

## 6. Create the External Location

Create an external location pointing to the Azure storage container:

* **URL:** `abfss://<container>@<storage-account>.dfs.core.windows.net`
* **Storage credential:** the credential created in step 5

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-22.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=5350703137e01e3aa7e100a359ff92b0" alt="Create external location" width="1920" height="741" data-path="images/ursa-lakehouse/uc-iceberg-azure-22.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-23.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=173e7f85132034017c4975d85ac39725" alt="External location settings" width="1920" height="1061" data-path="images/ursa-lakehouse/uc-iceberg-azure-23.webp" />

## 7. Create the Unity Catalog

Create a new Catalog and bind it to the external location created in step 6.

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-24.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=5cef97aa16297dac4696e57e40fa808d" alt="Create catalog" width="1920" height="783" data-path="images/ursa-lakehouse/uc-iceberg-azure-24.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-25.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=6f57311712ac83f177b84319dc9f094f" alt="Catalog form" width="1920" height="947" data-path="images/ursa-lakehouse/uc-iceberg-azure-25.webp" />

## 8. Grant Catalog Permissions

Grant permissions on the catalog. The `EXTERNAL_USE_SCHEMA` permission is **required** for Iceberg Managed Tables in Unity Catalog.

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-26.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=03f12b002887db4f055e60cf38ac7122" alt="Grant permissions" width="1920" height="682" data-path="images/ursa-lakehouse/uc-iceberg-azure-26.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-27.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=048c3a6fde8dbba0e4ff4912c383ddbd" alt="EXTERNAL_USE_SCHEMA permission" width="1920" height="1065" data-path="images/ursa-lakehouse/uc-iceberg-azure-27.webp" />

## 9. Enable External Data Access on the Metastore

> **Note:** This action requires **Azure Account Admin** privileges; without them, the **Metastore** entry is not visible.

Enable **External data access** on the metastore. This step is **required** for Unity Catalog Iceberg Managed Tables.

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-28.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=e3dfc763fa9c5ee1e8a36782485e74cf" alt="Enable external data access" width="1920" height="735" data-path="images/ursa-lakehouse/uc-iceberg-azure-28.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-29.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=47fa744245200cd3e878fca9375def5a" alt="External data access enabled" width="1920" height="842" data-path="images/ursa-lakehouse/uc-iceberg-azure-29.webp" />

## 10. Create OAuth2 Credentials

Create an OAuth2 service principal that StreamNative Ursa will use to authenticate.

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-30.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=5157098a423ad56fc1403cf608764161" alt="OAuth2 setup" width="1920" height="951" data-path="images/ursa-lakehouse/uc-iceberg-azure-30.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-31.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=7838407ca375c928bb7e1f3ba383ad97" alt="OAuth2 setup" width="1920" height="760" data-path="images/ursa-lakehouse/uc-iceberg-azure-31.webp" />

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-32.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=b2fc24abcd1fa86427d0ac3349db9360" alt="OAuth2 setup" width="1920" height="731" data-path="images/ursa-lakehouse/uc-iceberg-azure-32.webp" />

Generate a secret for the principal and record both the **Client ID** and **Client Secret**.

<img src="https://mintcdn.com/streamnative/x2q9Vy9571owFXU5/images/ursa-lakehouse/uc-iceberg-azure-33.webp?fit=max&auto=format&n=x2q9Vy9571owFXU5&q=85&s=e4b02fbfc883f98279a69b883f778980" alt="Generate secret" width="1920" height="710" data-path="images/ursa-lakehouse/uc-iceberg-azure-33.webp" />

## Catalog Information Summary

When the steps above are complete, collect the following values for the StreamNative Ursa compaction service:

| Value      | Description                                                                                                          |
| ---------- | -------------------------------------------------------------------------------------------------------------------- |
| URI        | Databricks workspace URL (e.g., `https://adb-<workspace-id>.azuredatabricks.net/api/2.1/unity-catalog/iceberg-rest`) |
| Warehouse  | The Unity Catalog name created in step 7                                                                             |
| Credential | `<client-id>:<client-secret>` from step 10                                                                           |

For the next steps, see [Configure Lakehouse Catalogs](../../../configure-lakehouse-catalogs).
