<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Managed vs External Storage in Unity Catalog on Azure: Where Should Your Data Live? in Community Articles</title>
    <link>https://community.databricks.com/t5/community-articles/managed-vs-external-storage-in-unity-catalog-on-azure-where/m-p/160880#M1327</link>
    <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="max-width: 860px; margin: 0 auto; padding: 0 32px 24px; background: #FFFFFF; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; color: #1b3139; line-height: 1.75; font-size: 17px;"&gt;
&lt;P style="margin: 0 0 16px;"&gt;I'm currently working with a banking customer migrating from Hive Metastore to Unity Catalog. While planning their catalog layout, one of their platform engineers asked the question that prompted this post: for their schemas and volumes, should they use managed or external storage, and how would they keep each business unit's data in its own storage account?&lt;/P&gt;
&lt;P style="margin: 16px 0;"&gt;They were leaning toward external, for two reasons: they believed managed storage meant Databricks would take custody of their data, and they believed managed storage could not be physically segregated by team. I hear both on almost every Hive Metastore migration. Neither holds up. The data stays in your own Azure storage either way, and managed storage can be segregated per business unit right down to the schema. Walking through the differences gave them a clear picture of the trade-offs, and since the same question comes up so often, I figured sharing it more widely would help.&lt;/P&gt;
&lt;P style="margin: 16px 0;"&gt;This post is that walkthrough. It covers both storage models on Azure: what they are, their trade-offs, when to pick each, where the two misconceptions break down, and a tested end-to-end example you can run yourself. Everything is backed by the Azure Databricks documentation linked at the end.&lt;/P&gt;
&lt;DIV style="background: #F0F4F6; border-left: 4px solid #FF3621; padding: 20px 24px; margin: 28px 0; border-radius: 6px;"&gt;
&lt;DIV style="font-size: 12px; font-weight: bold; color: #ff3621; text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 12px;"&gt;Key Takeaways&lt;/DIV&gt;
&lt;UL style="margin: 0; padding-left: 20px; color: #1b3139;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;"Managed" means Databricks optimizes your files. It does not mean Databricks owns your data. Your data stays in your own Azure storage, in open Delta format.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;Managed storage can be physically segregated per team or environment by assigning per-catalog or per-schema managed locations. The resolution order is schema &amp;gt; catalog &amp;gt; metastore.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;Managed is the default recommendation for governed analytical tables and volumes. External is the right tool for landing zones, fixed paths, register-in-place, and non-Databricks engines.&lt;/LI&gt;
&lt;LI style="margin-bottom: 0;"&gt;Creating external storage requires two separate privileges: CREATE STORAGE CREDENTIAL on the metastore, and CREATE EXTERNAL LOCATION on both the metastore and the credential.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;
&lt;DIV style="background: #FAFBFC; border: 1px solid #E8ECF0; border-radius: 8px; padding: 20px 28px; margin: 24px 0 16px;"&gt;
&lt;DIV style="font-size: 13px; font-weight: bold; color: #ff3621; text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 12px;"&gt;What's in this post&lt;/DIV&gt;
&lt;OL style="margin: 0; padding-left: 20px;"&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#blocks" target="_blank"&gt;The three building blocks&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#core" target="_blank"&gt;Managed vs external: the core difference&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#myth1" target="_blank"&gt;Myth 1: "Managed means lock-in"&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#myth2" target="_blank"&gt;Myth 2: "Managed storage can't be segregated"&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#managed-pros" target="_blank"&gt;Managed storage: pros and cons&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#external-pros" target="_blank"&gt;External storage: pros and cons&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#when" target="_blank"&gt;When to choose what&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#practices" target="_blank"&gt;Recommended best practices&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#creating" target="_blank"&gt;Creating external locations on Azure&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#walkthrough" target="_blank"&gt;Hands-on walkthrough: provision it and watch the data land&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 0; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#references" target="_blank"&gt;References&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;/DIV&gt;
&lt;HR /&gt;
&lt;H2 id="blocks" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;1. The three building blocks&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;Before comparing the two models, it helps to separate three concepts that are often conflated.&lt;/P&gt;
&lt;TABLE style="border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 15px;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;Concept&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;What it is&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;Scope&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Storage credential&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;A securable that holds the authentication to your Azure storage. On Azure this is an &lt;STRONG&gt;Azure Managed Identity&lt;/STRONG&gt; attached to a &lt;STRONG&gt;Databricks Access Connector&lt;/STRONG&gt;.&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Metastore&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;External location&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;A securable that pairs a storage credential with a specific &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;abfss://&lt;/CODE&gt; path. It is the governed gateway to a path in ADLS Gen2.&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Metastore&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Managed location&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;A path (which must sit inside an external location) where UC stores &lt;STRONG&gt;managed&lt;/STRONG&gt; tables and volumes. Can be set at metastore, catalog, or schema level.&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Metastore / Catalog / Schema&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;DIV style="background: #F0F4F6; border-left: 4px solid #1B3139; padding: 16px 20px; margin: 20px 0; border-radius: 4px; font-size: 15px;"&gt;&lt;STRONG&gt;The mental model:&lt;/STRONG&gt; a &lt;STRONG&gt;storage credential&lt;/STRONG&gt; says &lt;EM&gt;how&lt;/EM&gt; to authenticate, an &lt;STRONG&gt;external location&lt;/STRONG&gt; says &lt;EM&gt;which path&lt;/EM&gt; that credential governs, and a &lt;STRONG&gt;managed location&lt;/STRONG&gt; designates a path where UC takes over file layout for managed objects.&lt;/DIV&gt;
&lt;HR /&gt;
&lt;H2 id="core" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;2. Managed vs external: the core difference&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;The difference comes down to who controls the physical storage layout and lifecycle. Both store data in your own Azure storage account. The table below compares them side by side.&lt;/P&gt;
&lt;TABLE style="border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 15px;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600; width: 22%;"&gt;Dimension&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;Managed&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;External&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Storage path&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;UC chooses and controls the path under a designated managed location&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;You specify the exact &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;abfss://&lt;/CODE&gt; path with a &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;LOCATION&lt;/CODE&gt; clause&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;File layout and lifecycle&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;UC manages layout, directory structure, compaction, and cleanup&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;You own the file layout and lifecycle&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;How you reference objects&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;By name only (&lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;catalog.schema.table&lt;/CODE&gt;)&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;By name, and the data is also reachable by path&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Access from non-Databricks tools&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Through open interfaces (Iceberg REST, Delta Sharing, credential vending)&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Direct path read/write at the storage path&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;What happens on DROP&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Data is removed (8-day undrop window for tables)&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Underlying files are &lt;STRONG&gt;not&lt;/STRONG&gt; deleted&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Automatic optimization&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Yes (predictive optimization, auto liquid clustering)&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;No, you manage &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;OPTIMIZE&lt;/CODE&gt; / &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;VACUUM&lt;/CODE&gt; / statistics&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Best for&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Governed analytical tables and volumes created in Databricks&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Fixed paths, register-in-place, sharing with external engines&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Status in UC&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Default and recommended&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Use when a concrete path or external-tool requirement exists&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;HR /&gt;
&lt;H2 id="myth1" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;3. Myth 1: "Managed means lock-in"&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;The word "managed" is easy to misread as "Databricks takes custody of your data" or "you can never get it back out." Neither is true.&lt;/P&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Your data stays in your own Azure storage.&lt;/STRONG&gt; Managed tables and volumes are written to an ADLS Gen2 account in &lt;EM&gt;your&lt;/EM&gt; Azure subscription, governed by &lt;EM&gt;your&lt;/EM&gt; network and encryption policies. Databricks does not copy your data into Databricks-owned storage. You designate the storage account; UC writes there.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;"Managed" refers to file management, not ownership.&lt;/STRONG&gt; It means UC handles the physical file layout, compaction, statistics, and cleanup for you. You still own the storage account, the data, and the keys.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;The format is open, so there is no lock-in.&lt;/STRONG&gt; Data is stored as open Delta Lake (Parquet) files, readable from outside Databricks through open interfaces: the Iceberg REST Catalog, Delta Sharing, and credential vending for engines such as Spark, Trino, DuckDB, and Snowflake. You can share it without copying.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;You keep full access control.&lt;/STRONG&gt; Every read and write goes through Unity Catalog privileges that you define.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 16px 0;"&gt;A more accurate mental label for "managed" is &lt;STRONG&gt;"Databricks-optimized storage in your own account,"&lt;/STRONG&gt; as opposed to "Databricks-owned storage."&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="myth2" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;4. Myth 2: "Managed storage can't be segregated"&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;This is the one that pushes teams toward external storage unnecessarily. A managed table or volume does &lt;STRONG&gt;not&lt;/STRONG&gt; all land in one big shared bucket by default. UC resolves the managed storage path in this order:&lt;/P&gt;
&lt;OL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Schema&lt;/STRONG&gt; managed location, if set.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;Otherwise the &lt;STRONG&gt;catalog&lt;/STRONG&gt; managed location, if set.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;Otherwise the &lt;STRONG&gt;metastore&lt;/STRONG&gt; managed location.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P style="margin: 16px 0;"&gt;This gives you &lt;STRONG&gt;three levels of granularity&lt;/STRONG&gt; to physically separate managed data. You can point different catalogs, or even different schemas, at completely different ADLS Gen2 containers or paths.&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;Metastore managed location:  abfss://metastore@examplestorage.dfs.core.windows.net/
  └── Catalog: sales          MANAGED LOCATION  abfss://sales@examplestorage.dfs.core.windows.net/
        └── Schema: orders      MANAGED LOCATION  abfss://sales-orders@examplestorage.dfs.core.windows.net/&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;So if the requirement is separate underlying storage per team or per sensitivity tier, managed storage meets it. You get clean physical isolation by assigning each catalog or schema its own managed location. What managed storage does &lt;STRONG&gt;not&lt;/STRONG&gt; give you is control over the per-table directory names: UC creates hashed subdirectories (under &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;__unitystorage/...&lt;/CODE&gt;) to guarantee uniqueness. You control the &lt;STRONG&gt;container/path boundary&lt;/STRONG&gt;, UC controls the &lt;STRONG&gt;layout inside it&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P style="margin: 16px 0;"&gt;Volumes work the same way: create &lt;STRONG&gt;separate managed volumes&lt;/STRONG&gt; in separate schemas or catalogs, each with its own managed location, to segregate file storage exactly as you would with separate external paths.&lt;/P&gt;
&lt;DIV style="background: #F0F4F6; border-left: 4px solid #1B3139; padding: 16px 20px; margin: 20px 0; border-radius: 4px; font-size: 15px;"&gt;&lt;STRONG&gt;One constraint to know:&lt;/STRONG&gt; catalog and schema managed locations must be &lt;STRONG&gt;contained within an external location&lt;/STRONG&gt; you have already created. The metastore-level managed location is the exception, and it cannot overlap any external location.&lt;/DIV&gt;
&lt;HR /&gt;
&lt;H2 id="managed-pros" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;5. Managed storage: pros and cons&lt;/H2&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Pros&lt;/H3&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Automatic optimization.&lt;/STRONG&gt; Predictive optimization runs &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;OPTIMIZE&lt;/CODE&gt;, &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;VACUUM&lt;/CODE&gt;, and &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;ANALYZE&lt;/CODE&gt; for you. On by default for accounts created after November 11, 2024, rolling out to older accounts.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Automatic liquid clustering.&lt;/STRONG&gt; UC can select and maintain clustering keys automatically.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Lower long-term cost and faster queries.&lt;/STRONG&gt; Intelligent file sizing, statistics, and metadata caching reduce both storage and compute.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Less operational burden.&lt;/STRONG&gt; No path management, no manual layout decisions, no orphaned-file cleanup.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Auto-upgrade to new features.&lt;/STRONG&gt; Managed tables pick up new platform capabilities (catalog commits, multi-statement transactions, full-text search indexes) without re-architecting.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Strongest governance posture.&lt;/STRONG&gt; No path-based access means UC privileges are always enforced. There is no side door to the files.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Cons&lt;/H3&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;No direct path access.&lt;/STRONG&gt; You cannot point a non-Databricks tool at the files by path. Access is through UC-governed interfaces only (which now include the Iceberg REST Catalog, Delta Sharing, and credential vending for engines like Spark, Trino, DuckDB, and Snowflake).&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;You do not control the directory layout.&lt;/STRONG&gt; UC owns the subdirectory structure.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Drop deletes data&lt;/STRONG&gt; (after the undrop window). This is a plus for hygiene, a minus if you rely on files persisting after a drop.&lt;/LI&gt;
&lt;/UL&gt;
&lt;HR /&gt;
&lt;H2 id="external-pros" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;6. External storage: pros and cons&lt;/H2&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Pros&lt;/H3&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Explicit path control.&lt;/STRONG&gt; Data lives exactly where you put it. Useful when a downstream system expects a fixed path.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Interoperability with non-Databricks tools.&lt;/STRONG&gt; External tools can read and write the same files directly at the path.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Register existing data in place.&lt;/STRONG&gt; Point UC at data that already exists without moving it.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Drop does not delete data.&lt;/STRONG&gt; The files survive a dropped table or volume.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Cons&lt;/H3&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;No automatic optimization.&lt;/STRONG&gt; Predictive optimization, auto liquid clustering, and the managed-table maintenance features do not apply. You own &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;OPTIMIZE&lt;/CODE&gt;, &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;VACUUM&lt;/CODE&gt;, and statistics.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;You own the lifecycle.&lt;/STRONG&gt; Orphaned files, layout, and cleanup are your responsibility.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Governance gap on direct access.&lt;/STRONG&gt; When external tools read files by path outside UC interfaces, &lt;STRONG&gt;UC privileges are not enforced&lt;/STRONG&gt; on that direct file-system access. Governance is only as strong as the storage-account controls.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;More moving parts.&lt;/STRONG&gt; Every external path needs a storage credential, an external location, and grants. More to provision and audit.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Metadata drift.&lt;/STRONG&gt; Changes made to files outside Databricks may require &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;MSCK REPAIR TABLE ... SYNC METADATA&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;HR /&gt;
&lt;H2 id="when" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;7. When to choose what&lt;/H2&gt;
&lt;TABLE style="border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 15px;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600; width: 60%;"&gt;Situation&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;Recommended model&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;New tables created inside Databricks, no external reader&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;Managed&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;You want automatic optimization and lowest maintenance&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;Managed&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;You need physical separation per team or sensitivity tier&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;Managed&lt;/STRONG&gt;, with per-catalog or per-schema managed locations&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;Data must be read/written by a non-Databricks engine at a fixed path&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;External&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;Registering large existing datasets in place without moving them&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;External&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;Landing zones, ingestion drop folders, file-based interchange&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;External volume&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;A vendor or downstream app requires a known storage path&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;External&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;Highly regulated data where you want zero path-based side doors&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;Managed&lt;/STRONG&gt; (no direct path access by design)&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P style="margin: 16px 0;"&gt;A typical multi-team environment ends up with &lt;STRONG&gt;managed as the default&lt;/STRONG&gt; for governed analytical tables, and &lt;STRONG&gt;external locations reserved for&lt;/STRONG&gt; ingestion landing zones, file interchange, and integration with tools that genuinely need direct path access.&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="practices" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;8. Recommended best practices&lt;/H2&gt;
&lt;OL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Default to managed.&lt;/STRONG&gt; Make managed tables and volumes the norm. Reach for external only when a concrete requirement (path access, external tooling, register-in-place) demands it.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Segregate with catalogs and schemas, not with external storage.&lt;/STRONG&gt; Assign each team or environment its own catalog with its own &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;MANAGED LOCATION&lt;/CODE&gt;. Use schema-level managed locations for finer isolation. This gives you physical separation while keeping the governance benefits of managed.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Keep managed and external storage in separate, dedicated containers.&lt;/STRONG&gt; Managed storage cannot overlap external tables or external volumes. Plan a clean container layout up front: one set of containers for managed, separate containers for external/landing data.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;One Access Connector and storage credential per trust boundary.&lt;/STRONG&gt; Do not share a single credential across unrelated teams if their storage accounts have different access policies. Scope credentials to match your isolation model.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Prefer volumes over raw external-location file access.&lt;/STRONG&gt; When teams need file access, govern it through a volume rather than granting &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;READ FILES&lt;/CODE&gt; / &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;WRITE FILES&lt;/CODE&gt; broadly on an external location.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Grant the Access Connector identity Storage Blob Data Contributor&lt;/STRONG&gt; on the target ADLS Gen2 account or container. Nothing works without this role.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Use workspace bindings&lt;/STRONG&gt; on external locations and credentials to restrict which workspaces can use them, if you run multiple workspaces.&lt;/LI&gt;
&lt;/OL&gt;
&lt;HR /&gt;
&lt;H2 id="creating" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;9. Creating external locations on Azure&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;If you decide you need external storage, here is the end-to-end setup.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Permissions required&lt;/H3&gt;
&lt;P style="margin: 16px 0;"&gt;Creating external storage is a two-step, two-privilege process.&lt;/P&gt;
&lt;TABLE style="border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 15px;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600; width: 38%;"&gt;To do this&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;You need&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Create a &lt;STRONG&gt;storage credential&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE STORAGE CREDENTIAL&lt;/CODE&gt; on the metastore. Account admins and metastore admins have it by default.&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Create an &lt;STRONG&gt;external location&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE EXTERNAL LOCATION&lt;/CODE&gt; on &lt;STRONG&gt;both&lt;/STRONG&gt; the metastore &lt;STRONG&gt;and&lt;/STRONG&gt; the referenced storage credential. Metastore and workspace admins have it by default.&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P style="margin: 16px 0;"&gt;A non-admin who needs to create external locations must be granted, by a metastore admin: &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE STORAGE CREDENTIAL&lt;/CODE&gt; on the metastore (if they will also create the credential), &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE EXTERNAL LOCATION&lt;/CODE&gt; on the metastore, and &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE EXTERNAL LOCATION&lt;/CODE&gt; (or &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;MANAGE&lt;/CODE&gt;) on the specific storage credential.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Azure prerequisites&lt;/H3&gt;
&lt;OL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;An ADLS Gen2 storage account with &lt;STRONG&gt;hierarchical namespace enabled&lt;/STRONG&gt;. WORM/immutable containers are not supported.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;A &lt;STRONG&gt;Databricks Access Connector for Azure&lt;/STRONG&gt; with a system-assigned (or user-assigned) &lt;STRONG&gt;managed identity&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;That managed identity granted the &lt;STRONG&gt;Storage Blob Data Contributor&lt;/STRONG&gt; role on the storage account or container.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Step 1: Create the storage credential&lt;/H3&gt;
&lt;P style="margin: 16px 0;"&gt;On Azure, storage credentials backed by a managed identity are created through Catalog Explorer, the Databricks CLI, the REST API, or Terraform (there is no inline SQL form for Azure managed-identity credentials). The CLI form is:&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;databricks storage-credentials create --json '{
  "name": "adls_cred",
  "comment": "Managed identity for ADLS Gen2",
  "azure_managed_identity": {
    "access_connector_id": "/subscriptions/&amp;lt;sub-id&amp;gt;/resourceGroups/&amp;lt;rg&amp;gt;/providers/Microsoft.Databricks/accessConnectors/&amp;lt;connector-name&amp;gt;"
  }
}'&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;If the Access Connector uses a &lt;STRONG&gt;user-assigned&lt;/STRONG&gt; managed identity, add inside &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;azure_managed_identity&lt;/CODE&gt;:&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;"managed_identity_id": "/subscriptions/&amp;lt;sub-id&amp;gt;/resourceGroups/&amp;lt;rg&amp;gt;/providers/Microsoft.ManagedIdentity/userAssignedIdentities/&amp;lt;mi-name&amp;gt;"&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;In Catalog Explorer the equivalent fields are: Credential Type = "Azure Managed Identity", "Access Connector ID", and optionally "Managed Identity ID".&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Step 2: Create the external location&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;CREATE EXTERNAL LOCATION IF NOT EXISTS sales_landing
  URL 'abfss://landing@examplestorage.dfs.core.windows.net/sales'
  WITH (STORAGE CREDENTIAL adls_cred)
  COMMENT 'Sales landing zone';&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;Notes: the path is &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;abfss://&amp;lt;container&amp;gt;@&amp;lt;storage-account&amp;gt;.dfs.core.windows.net/&amp;lt;path&amp;gt;&lt;/CODE&gt;. Names containing hyphens must be backtick-quoted. The keyword &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;STORAGE&lt;/CODE&gt; is optional but the canonical form is &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;WITH (STORAGE CREDENTIAL ...)&lt;/CODE&gt;.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Step 3: Grant access on the external location&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;-- Allow a team to create external tables on this location
GRANT CREATE EXTERNAL TABLE ON EXTERNAL LOCATION sales_landing TO `data-engineers`;

-- Allow creating external volumes
GRANT CREATE EXTERNAL VOLUME ON EXTERNAL LOCATION sales_landing TO `data-engineers`;

-- Direct file read/write (WRITE FILES requires READ FILES too)
GRANT READ FILES, WRITE FILES ON EXTERNAL LOCATION sales_landing TO `ingestion-svc`;

-- Allow this location (or a subpath) to back a managed location for a catalog/schema
GRANT CREATE MANAGED STORAGE ON EXTERNAL LOCATION sales_landing TO `platform-admins`;

-- Review and transfer ownership
SHOW GRANTS ON EXTERNAL LOCATION sales_landing;
ALTER EXTERNAL LOCATION sales_landing OWNER TO `platform-admins`;&lt;/PRE&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Defining a segregated managed location on top of external&lt;/H3&gt;
&lt;P style="margin: 16px 0;"&gt;Because catalog and schema managed locations must sit inside an external location, the pattern for segregated &lt;STRONG&gt;managed&lt;/STRONG&gt; storage is: create the external location once, then point each catalog or schema's managed location at a subpath of it.&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;-- Catalog-level segregation: Sales managed data in its own container
CREATE CATALOG IF NOT EXISTS sales
  MANAGED LOCATION 'abfss://sales@examplestorage.dfs.core.windows.net/managed';

-- Schema-level segregation: Orders data in a separate path
CREATE SCHEMA IF NOT EXISTS sales.orders
  MANAGED LOCATION 'abfss://sales-orders@examplestorage.dfs.core.windows.net/managed';

-- A managed volume inherits the schema's managed location, physically isolated
CREATE VOLUME IF NOT EXISTS sales.orders.landing_files;&lt;/PRE&gt;
&lt;HR /&gt;
&lt;H2 id="walkthrough" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;10. Hands-on walkthrough: provision it and watch the data land&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;Reading about resolution order is one thing. Watching a managed table land in the exact container you chose is more convincing. Here is the full sequence run end to end on an Azure workspace, with the actual output. It creates a catalog on one container and a schema on a different container, then shows that the managed table and volume follow the schema.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Azure side: storage account and access connector&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;RG=rg-uc-blog; LOC=eastus; SA=ucblogdemostore

az group create -n $RG -l $LOC

# ADLS Gen2 = StorageV2 with hierarchical namespace enabled
az storage account create -n $SA -g $RG -l $LOC \
  --sku Standard_LRS --kind StorageV2 --enable-hierarchical-namespace true

for c in sales sales-orders landing; do
  az storage container create --account-name $SA --name $c --auth-mode login
done

# Databricks Access Connector with a system-assigned managed identity
az databricks access-connector create -n ac-uc-blog -g $RG -l $LOC --identity-type SystemAssigned

# grant that managed identity access to the storage account
MI=$(az databricks access-connector show -n ac-uc-blog -g $RG --query identity.principalId -o tsv)
SAID=$(az storage account show -n $SA -g $RG --query id -o tsv)
az role assignment create --assignee-object-id $MI --assignee-principal-type ServicePrincipal \
  --role "Storage Blob Data Contributor" --scope "$SAID"&lt;/PRE&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Unity Catalog side: credential and external locations&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;# storage credential wrapping the access connector
databricks storage-credentials create --json '{
  "name": "adls_cred",
  "azure_managed_identity": { "access_connector_id": "&amp;lt;access-connector-resource-id&amp;gt;" }
}'

# one external location per container
databricks external-locations create sales_el        abfss://sales@ucblogdemostore.dfs.core.windows.net/        adls_cred
databricks external-locations create sales_orders_el abfss://sales-orders@ucblogdemostore.dfs.core.windows.net/ adls_cred
databricks external-locations create landing_el      abfss://landing@ucblogdemostore.dfs.core.windows.net/      adls_cred&lt;/PRE&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Create the catalog and a schema on a different container&lt;/H3&gt;
&lt;P style="margin: 16px 0;"&gt;This is the segregation step: the catalog's managed location is on the &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;sales&lt;/CODE&gt; container, but the schema declares its own managed location on &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;sales-orders&lt;/CODE&gt;.&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;CREATE CATALOG av_sales_demo
  MANAGED LOCATION 'abfss://sales@ucblogdemostore.dfs.core.windows.net/managed';

CREATE SCHEMA av_sales_demo.orders
  MANAGED LOCATION 'abfss://sales-orders@ucblogdemostore.dfs.core.windows.net/managed';

CREATE TABLE av_sales_demo.orders.line_items (order_id BIGINT, region STRING, amount DECIMAL(10,2));
INSERT INTO av_sales_demo.orders.line_items VALUES (1,'EMEA',120.50),(2,'AMER',88.00),(3,'APAC',310.75);

CREATE VOLUME av_sales_demo.orders.landing_files;                                    -- managed
CREATE EXTERNAL VOLUME av_sales_demo.orders.raw_drop
  LOCATION 'abfss://landing@ucblogdemostore.dfs.core.windows.net/sales/raw_drop';    -- external&lt;/PRE&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Prove where the data physically landed&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;DESCRIBE DETAIL  av_sales_demo.orders.line_items;
DESCRIBE VOLUME  av_sales_demo.orders.landing_files;
DESCRIBE VOLUME  av_sales_demo.orders.raw_drop;&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;Actual output (trimmed to the relevant fields):&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;-- line_items  (MANAGED table)
location: abfss://sales-orders@ucblogdemostore.../managed/__unitystorage/schemas/a412770d-.../tables/5d24725c-...

-- landing_files  (MANAGED volume)
volume_type:      MANAGED
storage_location: abfss://sales-orders@ucblogdemostore.../managed/__unitystorage/schemas/a412770d-.../volumes/d3235d73-...

-- raw_drop  (EXTERNAL volume)
volume_type:      EXTERNAL
storage_location: abfss://landing@ucblogdemostore.../sales/raw_drop&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;The catalog's managed location is on the &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;sales&lt;/CODE&gt; container, yet the managed table and managed volume both landed under &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;sales-orders&lt;/CODE&gt;, because the &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;orders&lt;/CODE&gt; schema declared its own managed location and the schema wins over the catalog. That is physical storage segregation achieved with fully managed objects: no external tables, no loss of automatic optimization. The external volume sits exactly at the path it was given.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;The same view in Catalog Explorer&lt;/H3&gt;
&lt;FIGURE style="margin: 24px 0;"&gt;
&lt;FIGCAPTION style="font-size: 13px; color: #6b8a97; margin-top: 8px; font-style: italic;"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ashwin_DSA_0-1782751472981.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/28385i22E1362E8289C0D0/image-size/large?v=v2&amp;amp;px=999" role="button" title="Ashwin_DSA_0-1782751472981.png" alt="Ashwin_DSA_0-1782751472981.png" /&gt;&lt;/span&gt;&lt;BR /&gt;Catalog Explorer: the av_sales_demo catalog with its managed storage location pointing to the sales container. Managed objects that do not declare a schema-level override will land here.&lt;/FIGCAPTION&gt;
&lt;/FIGURE&gt;
&lt;FIGURE style="margin: 24px 0;"&gt;
&lt;FIGCAPTION style="font-size: 13px; color: #6b8a97; margin-top: 8px; font-style: italic;"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ashwin_DSA_1-1782751512839.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/28386i10131F8C5CA11FA8/image-size/large?v=v2&amp;amp;px=999" role="button" title="Ashwin_DSA_1-1782751512839.png" alt="Ashwin_DSA_1-1782751512839.png" /&gt;&lt;/span&gt;The orders schema overrides the catalog's managed location with its own, pointing at the sales-orders container. Any managed table or volume in this schema lands here instead.&lt;/FIGCAPTION&gt;
&lt;/FIGURE&gt;
&lt;FIGURE style="margin: 24px 0;"&gt;
&lt;FIGCAPTION style="font-size: 13px; color: #6b8a97; margin-top: 8px; font-style: italic;"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ashwin_DSA_2-1782751535604.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/28387iEF704BA113369124/image-size/large?v=v2&amp;amp;px=999" role="button" title="Ashwin_DSA_2-1782751535604.png" alt="Ashwin_DSA_2-1782751535604.png" /&gt;&lt;/span&gt;The line_items managed table detail. Despite the catalog pointing at sales, the table's storage location resolves to sales-orders. UC appends hashed __unitystorage/... subdirectories; you control the container boundary.&lt;/FIGCAPTION&gt;
&lt;/FIGURE&gt;
&lt;FIGURE style="margin: 24px 0;"&gt;
&lt;FIGCAPTION style="font-size: 13px; color: #6b8a97; margin-top: 8px; font-style: italic;"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ashwin_DSA_3-1782751554657.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/28389i45DF0B94EB805988/image-size/large?v=v2&amp;amp;px=999" role="button" title="Ashwin_DSA_3-1782751554657.png" alt="Ashwin_DSA_3-1782751554657.png" /&gt;&lt;/span&gt;The orders schema volumes side by side. landing_files is Managed (inherits the schema's sales-orders container). raw_drop is External (sits at the explicit abfss://landing/... path it was given).&lt;/FIGCAPTION&gt;
&lt;/FIGURE&gt;
&lt;HR /&gt;
&lt;H2 style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;Key takeaways&lt;/H2&gt;
&lt;OL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Storage credential, external location, and managed location are three distinct things.&lt;/STRONG&gt; A credential is &lt;EM&gt;how&lt;/EM&gt; to authenticate, an external location is &lt;EM&gt;which path&lt;/EM&gt; it governs, a managed location is &lt;EM&gt;where managed objects land&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Managed is the default and the recommendation&lt;/STRONG&gt; for governed analytical tables and volumes: automatic optimization, lower cost, strongest governance, least maintenance.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Managed does not mean lock-in.&lt;/STRONG&gt; Your data stays in your own Azure storage, in open Delta format, reachable through open interfaces.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Managed storage can be physically segregated&lt;/STRONG&gt; by assigning per-catalog or per-schema managed locations. The resolution order is schema &amp;gt; catalog &amp;gt; metastore.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;You control the container boundary, UC controls the layout inside it.&lt;/STRONG&gt; If a requirement is about the container or path boundary, managed meets it. If it is about exact directory naming or external-tool path access, that is where external fits.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;External is the right tool for landing zones, file interchange, register-in-place, and non-Databricks engines.&lt;/STRONG&gt; It costs you the automatic optimizations and opens a path-access governance gap, so scope it deliberately.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;To create external storage you need two privileges:&lt;/STRONG&gt; &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE STORAGE CREDENTIAL&lt;/CODE&gt; for the credential, and &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE EXTERNAL LOCATION&lt;/CODE&gt; on both the metastore and the credential for the location.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Keep managed and external in separate dedicated containers.&lt;/STRONG&gt; They cannot overlap, so plan the container layout before you start.&lt;/LI&gt;
&lt;/OL&gt;
&lt;HR /&gt;
&lt;H2 id="references" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;References&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;Official Azure Databricks documentation:&lt;/P&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/managed-storage" target="_blank" rel="noopener"&gt;Specify a managed storage location in Unity Catalog&lt;/A&gt;: metastore, catalog, and schema managed locations; resolution order.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/tables/managed" target="_blank" rel="noopener"&gt;Managed tables&lt;/A&gt;: default table type, automatic optimization, lifecycle.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/tables/external" target="_blank" rel="noopener"&gt;External tables&lt;/A&gt;: when to use, path control, lifecycle responsibilities.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/external-locations" target="_blank" rel="noopener"&gt;Create an external location&lt;/A&gt;: concepts and requirements.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/manage-external-locations" target="_blank" rel="noopener"&gt;Manage external locations&lt;/A&gt;: grants (READ FILES, WRITE FILES, CREATE EXTERNAL TABLE/VOLUME, CREATE MANAGED STORAGE).&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/storage-credentials" target="_blank" rel="noopener"&gt;Create a storage credential for ADLS&lt;/A&gt;: UI, CLI, API, and Terraform paths.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/azure-managed-identities" target="_blank" rel="noopener"&gt;Use Azure managed identities with the Access Connector&lt;/A&gt;: access connector and Storage Blob Data Contributor role.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-location" target="_blank" rel="noopener"&gt;CREATE EXTERNAL LOCATION (SQL reference)&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-catalog" target="_blank" rel="noopener"&gt;CREATE CATALOG (SQL reference)&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-schema" target="_blank" rel="noopener"&gt;CREATE SCHEMA (SQL reference)&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 0;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/data-governance/unity-catalog/manage-privileges/privileges" target="_blank" rel="noopener"&gt;Unity Catalog privileges and securable objects&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;</description>
    <pubDate>Mon, 29 Jun 2026 16:46:42 GMT</pubDate>
    <dc:creator>Ashwin_DSA</dc:creator>
    <dc:date>2026-06-29T16:46:42Z</dc:date>
    <item>
      <title>Managed vs External Storage in Unity Catalog on Azure: Where Should Your Data Live?</title>
      <link>https://community.databricks.com/t5/community-articles/managed-vs-external-storage-in-unity-catalog-on-azure-where/m-p/160880#M1327</link>
      <description>&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;DIV style="max-width: 860px; margin: 0 auto; padding: 0 32px 24px; background: #FFFFFF; font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Helvetica, Arial, sans-serif; color: #1b3139; line-height: 1.75; font-size: 17px;"&gt;
&lt;P style="margin: 0 0 16px;"&gt;I'm currently working with a banking customer migrating from Hive Metastore to Unity Catalog. While planning their catalog layout, one of their platform engineers asked the question that prompted this post: for their schemas and volumes, should they use managed or external storage, and how would they keep each business unit's data in its own storage account?&lt;/P&gt;
&lt;P style="margin: 16px 0;"&gt;They were leaning toward external, for two reasons: they believed managed storage meant Databricks would take custody of their data, and they believed managed storage could not be physically segregated by team. I hear both on almost every Hive Metastore migration. Neither holds up. The data stays in your own Azure storage either way, and managed storage can be segregated per business unit right down to the schema. Walking through the differences gave them a clear picture of the trade-offs, and since the same question comes up so often, I figured sharing it more widely would help.&lt;/P&gt;
&lt;P style="margin: 16px 0;"&gt;This post is that walkthrough. It covers both storage models on Azure: what they are, their trade-offs, when to pick each, where the two misconceptions break down, and a tested end-to-end example you can run yourself. Everything is backed by the Azure Databricks documentation linked at the end.&lt;/P&gt;
&lt;DIV style="background: #F0F4F6; border-left: 4px solid #FF3621; padding: 20px 24px; margin: 28px 0; border-radius: 6px;"&gt;
&lt;DIV style="font-size: 12px; font-weight: bold; color: #ff3621; text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 12px;"&gt;Key Takeaways&lt;/DIV&gt;
&lt;UL style="margin: 0; padding-left: 20px; color: #1b3139;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;"Managed" means Databricks optimizes your files. It does not mean Databricks owns your data. Your data stays in your own Azure storage, in open Delta format.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;Managed storage can be physically segregated per team or environment by assigning per-catalog or per-schema managed locations. The resolution order is schema &amp;gt; catalog &amp;gt; metastore.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;Managed is the default recommendation for governed analytical tables and volumes. External is the right tool for landing zones, fixed paths, register-in-place, and non-Databricks engines.&lt;/LI&gt;
&lt;LI style="margin-bottom: 0;"&gt;Creating external storage requires two separate privileges: CREATE STORAGE CREDENTIAL on the metastore, and CREATE EXTERNAL LOCATION on both the metastore and the credential.&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;
&lt;DIV style="background: #FAFBFC; border: 1px solid #E8ECF0; border-radius: 8px; padding: 20px 28px; margin: 24px 0 16px;"&gt;
&lt;DIV style="font-size: 13px; font-weight: bold; color: #ff3621; text-transform: uppercase; letter-spacing: 1.5px; margin-bottom: 12px;"&gt;What's in this post&lt;/DIV&gt;
&lt;OL style="margin: 0; padding-left: 20px;"&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#blocks" target="_blank"&gt;The three building blocks&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#core" target="_blank"&gt;Managed vs external: the core difference&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#myth1" target="_blank"&gt;Myth 1: "Managed means lock-in"&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#myth2" target="_blank"&gt;Myth 2: "Managed storage can't be segregated"&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#managed-pros" target="_blank"&gt;Managed storage: pros and cons&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#external-pros" target="_blank"&gt;External storage: pros and cons&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#when" target="_blank"&gt;When to choose what&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#practices" target="_blank"&gt;Recommended best practices&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#creating" target="_blank"&gt;Creating external locations on Azure&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 6px; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#walkthrough" target="_blank"&gt;Hands-on walkthrough: provision it and watch the data land&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 0; font-size: 15px;"&gt;&lt;A style="color: #1b3139; text-decoration: none;" href="#references" target="_blank"&gt;References&lt;/A&gt;&lt;/LI&gt;
&lt;/OL&gt;
&lt;/DIV&gt;
&lt;HR /&gt;
&lt;H2 id="blocks" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;1. The three building blocks&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;Before comparing the two models, it helps to separate three concepts that are often conflated.&lt;/P&gt;
&lt;TABLE style="border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 15px;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;Concept&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;What it is&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;Scope&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Storage credential&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;A securable that holds the authentication to your Azure storage. On Azure this is an &lt;STRONG&gt;Azure Managed Identity&lt;/STRONG&gt; attached to a &lt;STRONG&gt;Databricks Access Connector&lt;/STRONG&gt;.&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Metastore&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;External location&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;A securable that pairs a storage credential with a specific &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;abfss://&lt;/CODE&gt; path. It is the governed gateway to a path in ADLS Gen2.&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Metastore&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Managed location&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;A path (which must sit inside an external location) where UC stores &lt;STRONG&gt;managed&lt;/STRONG&gt; tables and volumes. Can be set at metastore, catalog, or schema level.&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Metastore / Catalog / Schema&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;DIV style="background: #F0F4F6; border-left: 4px solid #1B3139; padding: 16px 20px; margin: 20px 0; border-radius: 4px; font-size: 15px;"&gt;&lt;STRONG&gt;The mental model:&lt;/STRONG&gt; a &lt;STRONG&gt;storage credential&lt;/STRONG&gt; says &lt;EM&gt;how&lt;/EM&gt; to authenticate, an &lt;STRONG&gt;external location&lt;/STRONG&gt; says &lt;EM&gt;which path&lt;/EM&gt; that credential governs, and a &lt;STRONG&gt;managed location&lt;/STRONG&gt; designates a path where UC takes over file layout for managed objects.&lt;/DIV&gt;
&lt;HR /&gt;
&lt;H2 id="core" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;2. Managed vs external: the core difference&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;The difference comes down to who controls the physical storage layout and lifecycle. Both store data in your own Azure storage account. The table below compares them side by side.&lt;/P&gt;
&lt;TABLE style="border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 15px;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600; width: 22%;"&gt;Dimension&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;Managed&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;External&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Storage path&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;UC chooses and controls the path under a designated managed location&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;You specify the exact &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;abfss://&lt;/CODE&gt; path with a &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;LOCATION&lt;/CODE&gt; clause&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;File layout and lifecycle&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;UC manages layout, directory structure, compaction, and cleanup&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;You own the file layout and lifecycle&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;How you reference objects&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;By name only (&lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;catalog.schema.table&lt;/CODE&gt;)&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;By name, and the data is also reachable by path&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Access from non-Databricks tools&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Through open interfaces (Iceberg REST, Delta Sharing, credential vending)&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Direct path read/write at the storage path&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;What happens on DROP&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Data is removed (8-day undrop window for tables)&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Underlying files are &lt;STRONG&gt;not&lt;/STRONG&gt; deleted&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Automatic optimization&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Yes (predictive optimization, auto liquid clustering)&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;No, you manage &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;OPTIMIZE&lt;/CODE&gt; / &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;VACUUM&lt;/CODE&gt; / statistics&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Best for&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Governed analytical tables and volumes created in Databricks&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Fixed paths, register-in-place, sharing with external engines&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Status in UC&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;STRONG&gt;Default and recommended&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Use when a concrete path or external-tool requirement exists&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;HR /&gt;
&lt;H2 id="myth1" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;3. Myth 1: "Managed means lock-in"&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;The word "managed" is easy to misread as "Databricks takes custody of your data" or "you can never get it back out." Neither is true.&lt;/P&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Your data stays in your own Azure storage.&lt;/STRONG&gt; Managed tables and volumes are written to an ADLS Gen2 account in &lt;EM&gt;your&lt;/EM&gt; Azure subscription, governed by &lt;EM&gt;your&lt;/EM&gt; network and encryption policies. Databricks does not copy your data into Databricks-owned storage. You designate the storage account; UC writes there.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;"Managed" refers to file management, not ownership.&lt;/STRONG&gt; It means UC handles the physical file layout, compaction, statistics, and cleanup for you. You still own the storage account, the data, and the keys.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;The format is open, so there is no lock-in.&lt;/STRONG&gt; Data is stored as open Delta Lake (Parquet) files, readable from outside Databricks through open interfaces: the Iceberg REST Catalog, Delta Sharing, and credential vending for engines such as Spark, Trino, DuckDB, and Snowflake. You can share it without copying.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;You keep full access control.&lt;/STRONG&gt; Every read and write goes through Unity Catalog privileges that you define.&lt;/LI&gt;
&lt;/UL&gt;
&lt;P style="margin: 16px 0;"&gt;A more accurate mental label for "managed" is &lt;STRONG&gt;"Databricks-optimized storage in your own account,"&lt;/STRONG&gt; as opposed to "Databricks-owned storage."&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="myth2" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;4. Myth 2: "Managed storage can't be segregated"&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;This is the one that pushes teams toward external storage unnecessarily. A managed table or volume does &lt;STRONG&gt;not&lt;/STRONG&gt; all land in one big shared bucket by default. UC resolves the managed storage path in this order:&lt;/P&gt;
&lt;OL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Schema&lt;/STRONG&gt; managed location, if set.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;Otherwise the &lt;STRONG&gt;catalog&lt;/STRONG&gt; managed location, if set.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;Otherwise the &lt;STRONG&gt;metastore&lt;/STRONG&gt; managed location.&lt;/LI&gt;
&lt;/OL&gt;
&lt;P style="margin: 16px 0;"&gt;This gives you &lt;STRONG&gt;three levels of granularity&lt;/STRONG&gt; to physically separate managed data. You can point different catalogs, or even different schemas, at completely different ADLS Gen2 containers or paths.&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;Metastore managed location:  abfss://metastore@examplestorage.dfs.core.windows.net/
  └── Catalog: sales          MANAGED LOCATION  abfss://sales@examplestorage.dfs.core.windows.net/
        └── Schema: orders      MANAGED LOCATION  abfss://sales-orders@examplestorage.dfs.core.windows.net/&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;So if the requirement is separate underlying storage per team or per sensitivity tier, managed storage meets it. You get clean physical isolation by assigning each catalog or schema its own managed location. What managed storage does &lt;STRONG&gt;not&lt;/STRONG&gt; give you is control over the per-table directory names: UC creates hashed subdirectories (under &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;__unitystorage/...&lt;/CODE&gt;) to guarantee uniqueness. You control the &lt;STRONG&gt;container/path boundary&lt;/STRONG&gt;, UC controls the &lt;STRONG&gt;layout inside it&lt;/STRONG&gt;.&lt;/P&gt;
&lt;P style="margin: 16px 0;"&gt;Volumes work the same way: create &lt;STRONG&gt;separate managed volumes&lt;/STRONG&gt; in separate schemas or catalogs, each with its own managed location, to segregate file storage exactly as you would with separate external paths.&lt;/P&gt;
&lt;DIV style="background: #F0F4F6; border-left: 4px solid #1B3139; padding: 16px 20px; margin: 20px 0; border-radius: 4px; font-size: 15px;"&gt;&lt;STRONG&gt;One constraint to know:&lt;/STRONG&gt; catalog and schema managed locations must be &lt;STRONG&gt;contained within an external location&lt;/STRONG&gt; you have already created. The metastore-level managed location is the exception, and it cannot overlap any external location.&lt;/DIV&gt;
&lt;HR /&gt;
&lt;H2 id="managed-pros" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;5. Managed storage: pros and cons&lt;/H2&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Pros&lt;/H3&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Automatic optimization.&lt;/STRONG&gt; Predictive optimization runs &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;OPTIMIZE&lt;/CODE&gt;, &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;VACUUM&lt;/CODE&gt;, and &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;ANALYZE&lt;/CODE&gt; for you. On by default for accounts created after November 11, 2024, rolling out to older accounts.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Automatic liquid clustering.&lt;/STRONG&gt; UC can select and maintain clustering keys automatically.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Lower long-term cost and faster queries.&lt;/STRONG&gt; Intelligent file sizing, statistics, and metadata caching reduce both storage and compute.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Less operational burden.&lt;/STRONG&gt; No path management, no manual layout decisions, no orphaned-file cleanup.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Auto-upgrade to new features.&lt;/STRONG&gt; Managed tables pick up new platform capabilities (catalog commits, multi-statement transactions, full-text search indexes) without re-architecting.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Strongest governance posture.&lt;/STRONG&gt; No path-based access means UC privileges are always enforced. There is no side door to the files.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Cons&lt;/H3&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;No direct path access.&lt;/STRONG&gt; You cannot point a non-Databricks tool at the files by path. Access is through UC-governed interfaces only (which now include the Iceberg REST Catalog, Delta Sharing, and credential vending for engines like Spark, Trino, DuckDB, and Snowflake).&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;You do not control the directory layout.&lt;/STRONG&gt; UC owns the subdirectory structure.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Drop deletes data&lt;/STRONG&gt; (after the undrop window). This is a plus for hygiene, a minus if you rely on files persisting after a drop.&lt;/LI&gt;
&lt;/UL&gt;
&lt;HR /&gt;
&lt;H2 id="external-pros" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;6. External storage: pros and cons&lt;/H2&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Pros&lt;/H3&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Explicit path control.&lt;/STRONG&gt; Data lives exactly where you put it. Useful when a downstream system expects a fixed path.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Interoperability with non-Databricks tools.&lt;/STRONG&gt; External tools can read and write the same files directly at the path.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Register existing data in place.&lt;/STRONG&gt; Point UC at data that already exists without moving it.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Drop does not delete data.&lt;/STRONG&gt; The files survive a dropped table or volume.&lt;/LI&gt;
&lt;/UL&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Cons&lt;/H3&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;No automatic optimization.&lt;/STRONG&gt; Predictive optimization, auto liquid clustering, and the managed-table maintenance features do not apply. You own &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;OPTIMIZE&lt;/CODE&gt;, &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;VACUUM&lt;/CODE&gt;, and statistics.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;You own the lifecycle.&lt;/STRONG&gt; Orphaned files, layout, and cleanup are your responsibility.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Governance gap on direct access.&lt;/STRONG&gt; When external tools read files by path outside UC interfaces, &lt;STRONG&gt;UC privileges are not enforced&lt;/STRONG&gt; on that direct file-system access. Governance is only as strong as the storage-account controls.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;More moving parts.&lt;/STRONG&gt; Every external path needs a storage credential, an external location, and grants. More to provision and audit.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;STRONG&gt;Metadata drift.&lt;/STRONG&gt; Changes made to files outside Databricks may require &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;MSCK REPAIR TABLE ... SYNC METADATA&lt;/CODE&gt;.&lt;/LI&gt;
&lt;/UL&gt;
&lt;HR /&gt;
&lt;H2 id="when" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;7. When to choose what&lt;/H2&gt;
&lt;TABLE style="border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 15px;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600; width: 60%;"&gt;Situation&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;Recommended model&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;New tables created inside Databricks, no external reader&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;Managed&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;You want automatic optimization and lowest maintenance&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;Managed&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;You need physical separation per team or sensitivity tier&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;Managed&lt;/STRONG&gt;, with per-catalog or per-schema managed locations&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;Data must be read/written by a non-Databricks engine at a fixed path&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;External&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;Registering large existing datasets in place without moving them&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;External&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;Landing zones, ingestion drop folders, file-based interchange&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;External volume&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;A vendor or downstream app requires a known storage path&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;External&lt;/STRONG&gt;&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;Highly regulated data where you want zero path-based side doors&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0;"&gt;&lt;STRONG&gt;Managed&lt;/STRONG&gt; (no direct path access by design)&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P style="margin: 16px 0;"&gt;A typical multi-team environment ends up with &lt;STRONG&gt;managed as the default&lt;/STRONG&gt; for governed analytical tables, and &lt;STRONG&gt;external locations reserved for&lt;/STRONG&gt; ingestion landing zones, file interchange, and integration with tools that genuinely need direct path access.&lt;/P&gt;
&lt;HR /&gt;
&lt;H2 id="practices" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;8. Recommended best practices&lt;/H2&gt;
&lt;OL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Default to managed.&lt;/STRONG&gt; Make managed tables and volumes the norm. Reach for external only when a concrete requirement (path access, external tooling, register-in-place) demands it.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Segregate with catalogs and schemas, not with external storage.&lt;/STRONG&gt; Assign each team or environment its own catalog with its own &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;MANAGED LOCATION&lt;/CODE&gt;. Use schema-level managed locations for finer isolation. This gives you physical separation while keeping the governance benefits of managed.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Keep managed and external storage in separate, dedicated containers.&lt;/STRONG&gt; Managed storage cannot overlap external tables or external volumes. Plan a clean container layout up front: one set of containers for managed, separate containers for external/landing data.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;One Access Connector and storage credential per trust boundary.&lt;/STRONG&gt; Do not share a single credential across unrelated teams if their storage accounts have different access policies. Scope credentials to match your isolation model.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Prefer volumes over raw external-location file access.&lt;/STRONG&gt; When teams need file access, govern it through a volume rather than granting &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;READ FILES&lt;/CODE&gt; / &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;WRITE FILES&lt;/CODE&gt; broadly on an external location.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Grant the Access Connector identity Storage Blob Data Contributor&lt;/STRONG&gt; on the target ADLS Gen2 account or container. Nothing works without this role.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Use workspace bindings&lt;/STRONG&gt; on external locations and credentials to restrict which workspaces can use them, if you run multiple workspaces.&lt;/LI&gt;
&lt;/OL&gt;
&lt;HR /&gt;
&lt;H2 id="creating" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;9. Creating external locations on Azure&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;If you decide you need external storage, here is the end-to-end setup.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Permissions required&lt;/H3&gt;
&lt;P style="margin: 16px 0;"&gt;Creating external storage is a two-step, two-privilege process.&lt;/P&gt;
&lt;TABLE style="border-collapse: collapse; width: 100%; margin: 16px 0; font-size: 15px;"&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600; width: 38%;"&gt;To do this&lt;/TH&gt;
&lt;TH style="background: #1B3139; color: #fff; padding: 10px 14px; text-align: left; font-weight: 600;"&gt;You need&lt;/TH&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Create a &lt;STRONG&gt;storage credential&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE STORAGE CREDENTIAL&lt;/CODE&gt; on the metastore. Account admins and metastore admins have it by default.&lt;/TD&gt;
&lt;/TR&gt;
&lt;TR&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;Create an &lt;STRONG&gt;external location&lt;/STRONG&gt;&lt;/TD&gt;
&lt;TD style="padding: 10px 14px; border-bottom: 1px solid #E8ECF0; vertical-align: top;"&gt;&lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE EXTERNAL LOCATION&lt;/CODE&gt; on &lt;STRONG&gt;both&lt;/STRONG&gt; the metastore &lt;STRONG&gt;and&lt;/STRONG&gt; the referenced storage credential. Metastore and workspace admins have it by default.&lt;/TD&gt;
&lt;/TR&gt;
&lt;/TBODY&gt;
&lt;/TABLE&gt;
&lt;P style="margin: 16px 0;"&gt;A non-admin who needs to create external locations must be granted, by a metastore admin: &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE STORAGE CREDENTIAL&lt;/CODE&gt; on the metastore (if they will also create the credential), &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE EXTERNAL LOCATION&lt;/CODE&gt; on the metastore, and &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE EXTERNAL LOCATION&lt;/CODE&gt; (or &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;MANAGE&lt;/CODE&gt;) on the specific storage credential.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Azure prerequisites&lt;/H3&gt;
&lt;OL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;An ADLS Gen2 storage account with &lt;STRONG&gt;hierarchical namespace enabled&lt;/STRONG&gt;. WORM/immutable containers are not supported.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;A &lt;STRONG&gt;Databricks Access Connector for Azure&lt;/STRONG&gt; with a system-assigned (or user-assigned) &lt;STRONG&gt;managed identity&lt;/STRONG&gt;.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;That managed identity granted the &lt;STRONG&gt;Storage Blob Data Contributor&lt;/STRONG&gt; role on the storage account or container.&lt;/LI&gt;
&lt;/OL&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Step 1: Create the storage credential&lt;/H3&gt;
&lt;P style="margin: 16px 0;"&gt;On Azure, storage credentials backed by a managed identity are created through Catalog Explorer, the Databricks CLI, the REST API, or Terraform (there is no inline SQL form for Azure managed-identity credentials). The CLI form is:&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;databricks storage-credentials create --json '{
  "name": "adls_cred",
  "comment": "Managed identity for ADLS Gen2",
  "azure_managed_identity": {
    "access_connector_id": "/subscriptions/&amp;lt;sub-id&amp;gt;/resourceGroups/&amp;lt;rg&amp;gt;/providers/Microsoft.Databricks/accessConnectors/&amp;lt;connector-name&amp;gt;"
  }
}'&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;If the Access Connector uses a &lt;STRONG&gt;user-assigned&lt;/STRONG&gt; managed identity, add inside &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;azure_managed_identity&lt;/CODE&gt;:&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;"managed_identity_id": "/subscriptions/&amp;lt;sub-id&amp;gt;/resourceGroups/&amp;lt;rg&amp;gt;/providers/Microsoft.ManagedIdentity/userAssignedIdentities/&amp;lt;mi-name&amp;gt;"&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;In Catalog Explorer the equivalent fields are: Credential Type = "Azure Managed Identity", "Access Connector ID", and optionally "Managed Identity ID".&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Step 2: Create the external location&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;CREATE EXTERNAL LOCATION IF NOT EXISTS sales_landing
  URL 'abfss://landing@examplestorage.dfs.core.windows.net/sales'
  WITH (STORAGE CREDENTIAL adls_cred)
  COMMENT 'Sales landing zone';&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;Notes: the path is &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;abfss://&amp;lt;container&amp;gt;@&amp;lt;storage-account&amp;gt;.dfs.core.windows.net/&amp;lt;path&amp;gt;&lt;/CODE&gt;. Names containing hyphens must be backtick-quoted. The keyword &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;STORAGE&lt;/CODE&gt; is optional but the canonical form is &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;WITH (STORAGE CREDENTIAL ...)&lt;/CODE&gt;.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Step 3: Grant access on the external location&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;-- Allow a team to create external tables on this location
GRANT CREATE EXTERNAL TABLE ON EXTERNAL LOCATION sales_landing TO `data-engineers`;

-- Allow creating external volumes
GRANT CREATE EXTERNAL VOLUME ON EXTERNAL LOCATION sales_landing TO `data-engineers`;

-- Direct file read/write (WRITE FILES requires READ FILES too)
GRANT READ FILES, WRITE FILES ON EXTERNAL LOCATION sales_landing TO `ingestion-svc`;

-- Allow this location (or a subpath) to back a managed location for a catalog/schema
GRANT CREATE MANAGED STORAGE ON EXTERNAL LOCATION sales_landing TO `platform-admins`;

-- Review and transfer ownership
SHOW GRANTS ON EXTERNAL LOCATION sales_landing;
ALTER EXTERNAL LOCATION sales_landing OWNER TO `platform-admins`;&lt;/PRE&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Defining a segregated managed location on top of external&lt;/H3&gt;
&lt;P style="margin: 16px 0;"&gt;Because catalog and schema managed locations must sit inside an external location, the pattern for segregated &lt;STRONG&gt;managed&lt;/STRONG&gt; storage is: create the external location once, then point each catalog or schema's managed location at a subpath of it.&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;-- Catalog-level segregation: Sales managed data in its own container
CREATE CATALOG IF NOT EXISTS sales
  MANAGED LOCATION 'abfss://sales@examplestorage.dfs.core.windows.net/managed';

-- Schema-level segregation: Orders data in a separate path
CREATE SCHEMA IF NOT EXISTS sales.orders
  MANAGED LOCATION 'abfss://sales-orders@examplestorage.dfs.core.windows.net/managed';

-- A managed volume inherits the schema's managed location, physically isolated
CREATE VOLUME IF NOT EXISTS sales.orders.landing_files;&lt;/PRE&gt;
&lt;HR /&gt;
&lt;H2 id="walkthrough" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;10. Hands-on walkthrough: provision it and watch the data land&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;Reading about resolution order is one thing. Watching a managed table land in the exact container you chose is more convincing. Here is the full sequence run end to end on an Azure workspace, with the actual output. It creates a catalog on one container and a schema on a different container, then shows that the managed table and volume follow the schema.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Azure side: storage account and access connector&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;RG=rg-uc-blog; LOC=eastus; SA=ucblogdemostore

az group create -n $RG -l $LOC

# ADLS Gen2 = StorageV2 with hierarchical namespace enabled
az storage account create -n $SA -g $RG -l $LOC \
  --sku Standard_LRS --kind StorageV2 --enable-hierarchical-namespace true

for c in sales sales-orders landing; do
  az storage container create --account-name $SA --name $c --auth-mode login
done

# Databricks Access Connector with a system-assigned managed identity
az databricks access-connector create -n ac-uc-blog -g $RG -l $LOC --identity-type SystemAssigned

# grant that managed identity access to the storage account
MI=$(az databricks access-connector show -n ac-uc-blog -g $RG --query identity.principalId -o tsv)
SAID=$(az storage account show -n $SA -g $RG --query id -o tsv)
az role assignment create --assignee-object-id $MI --assignee-principal-type ServicePrincipal \
  --role "Storage Blob Data Contributor" --scope "$SAID"&lt;/PRE&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Unity Catalog side: credential and external locations&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;# storage credential wrapping the access connector
databricks storage-credentials create --json '{
  "name": "adls_cred",
  "azure_managed_identity": { "access_connector_id": "&amp;lt;access-connector-resource-id&amp;gt;" }
}'

# one external location per container
databricks external-locations create sales_el        abfss://sales@ucblogdemostore.dfs.core.windows.net/        adls_cred
databricks external-locations create sales_orders_el abfss://sales-orders@ucblogdemostore.dfs.core.windows.net/ adls_cred
databricks external-locations create landing_el      abfss://landing@ucblogdemostore.dfs.core.windows.net/      adls_cred&lt;/PRE&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Create the catalog and a schema on a different container&lt;/H3&gt;
&lt;P style="margin: 16px 0;"&gt;This is the segregation step: the catalog's managed location is on the &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;sales&lt;/CODE&gt; container, but the schema declares its own managed location on &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;sales-orders&lt;/CODE&gt;.&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;CREATE CATALOG av_sales_demo
  MANAGED LOCATION 'abfss://sales@ucblogdemostore.dfs.core.windows.net/managed';

CREATE SCHEMA av_sales_demo.orders
  MANAGED LOCATION 'abfss://sales-orders@ucblogdemostore.dfs.core.windows.net/managed';

CREATE TABLE av_sales_demo.orders.line_items (order_id BIGINT, region STRING, amount DECIMAL(10,2));
INSERT INTO av_sales_demo.orders.line_items VALUES (1,'EMEA',120.50),(2,'AMER',88.00),(3,'APAC',310.75);

CREATE VOLUME av_sales_demo.orders.landing_files;                                    -- managed
CREATE EXTERNAL VOLUME av_sales_demo.orders.raw_drop
  LOCATION 'abfss://landing@ucblogdemostore.dfs.core.windows.net/sales/raw_drop';    -- external&lt;/PRE&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;Prove where the data physically landed&lt;/H3&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;DESCRIBE DETAIL  av_sales_demo.orders.line_items;
DESCRIBE VOLUME  av_sales_demo.orders.landing_files;
DESCRIBE VOLUME  av_sales_demo.orders.raw_drop;&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;Actual output (trimmed to the relevant fields):&lt;/P&gt;
&lt;PRE style="background: #1B3139; border-left: 4px solid #FF3621; border-radius: 6px; padding: 20px 24px; margin: 20px 0; font-family: 'SF Mono', Monaco, Consolas, 'Courier New', monospace; font-size: 13.5px; line-height: 1.6; color: #e8ecf0; overflow-x: auto;"&gt;-- line_items  (MANAGED table)
location: abfss://sales-orders@ucblogdemostore.../managed/__unitystorage/schemas/a412770d-.../tables/5d24725c-...

-- landing_files  (MANAGED volume)
volume_type:      MANAGED
storage_location: abfss://sales-orders@ucblogdemostore.../managed/__unitystorage/schemas/a412770d-.../volumes/d3235d73-...

-- raw_drop  (EXTERNAL volume)
volume_type:      EXTERNAL
storage_location: abfss://landing@ucblogdemostore.../sales/raw_drop&lt;/PRE&gt;
&lt;P style="margin: 16px 0;"&gt;The catalog's managed location is on the &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;sales&lt;/CODE&gt; container, yet the managed table and managed volume both landed under &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;sales-orders&lt;/CODE&gt;, because the &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;orders&lt;/CODE&gt; schema declared its own managed location and the schema wins over the catalog. That is physical storage segregation achieved with fully managed objects: no external tables, no loss of automatic optimization. The external volume sits exactly at the path it was given.&lt;/P&gt;
&lt;H3 style="font-size: 19px; font-weight: bold; color: #1b3139; margin: 24px 0 12px;"&gt;The same view in Catalog Explorer&lt;/H3&gt;
&lt;FIGURE style="margin: 24px 0;"&gt;
&lt;FIGCAPTION style="font-size: 13px; color: #6b8a97; margin-top: 8px; font-style: italic;"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ashwin_DSA_0-1782751472981.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/28385i22E1362E8289C0D0/image-size/large?v=v2&amp;amp;px=999" role="button" title="Ashwin_DSA_0-1782751472981.png" alt="Ashwin_DSA_0-1782751472981.png" /&gt;&lt;/span&gt;&lt;BR /&gt;Catalog Explorer: the av_sales_demo catalog with its managed storage location pointing to the sales container. Managed objects that do not declare a schema-level override will land here.&lt;/FIGCAPTION&gt;
&lt;/FIGURE&gt;
&lt;FIGURE style="margin: 24px 0;"&gt;
&lt;FIGCAPTION style="font-size: 13px; color: #6b8a97; margin-top: 8px; font-style: italic;"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ashwin_DSA_1-1782751512839.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/28386i10131F8C5CA11FA8/image-size/large?v=v2&amp;amp;px=999" role="button" title="Ashwin_DSA_1-1782751512839.png" alt="Ashwin_DSA_1-1782751512839.png" /&gt;&lt;/span&gt;The orders schema overrides the catalog's managed location with its own, pointing at the sales-orders container. Any managed table or volume in this schema lands here instead.&lt;/FIGCAPTION&gt;
&lt;/FIGURE&gt;
&lt;FIGURE style="margin: 24px 0;"&gt;
&lt;FIGCAPTION style="font-size: 13px; color: #6b8a97; margin-top: 8px; font-style: italic;"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ashwin_DSA_2-1782751535604.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/28387iEF704BA113369124/image-size/large?v=v2&amp;amp;px=999" role="button" title="Ashwin_DSA_2-1782751535604.png" alt="Ashwin_DSA_2-1782751535604.png" /&gt;&lt;/span&gt;The line_items managed table detail. Despite the catalog pointing at sales, the table's storage location resolves to sales-orders. UC appends hashed __unitystorage/... subdirectories; you control the container boundary.&lt;/FIGCAPTION&gt;
&lt;/FIGURE&gt;
&lt;FIGURE style="margin: 24px 0;"&gt;
&lt;FIGCAPTION style="font-size: 13px; color: #6b8a97; margin-top: 8px; font-style: italic;"&gt;&lt;span class="lia-inline-image-display-wrapper lia-image-align-inline" image-alt="Ashwin_DSA_3-1782751554657.png" style="width: 999px;"&gt;&lt;img src="https://community.databricks.com/t5/image/serverpage/image-id/28389i45DF0B94EB805988/image-size/large?v=v2&amp;amp;px=999" role="button" title="Ashwin_DSA_3-1782751554657.png" alt="Ashwin_DSA_3-1782751554657.png" /&gt;&lt;/span&gt;The orders schema volumes side by side. landing_files is Managed (inherits the schema's sales-orders container). raw_drop is External (sits at the explicit abfss://landing/... path it was given).&lt;/FIGCAPTION&gt;
&lt;/FIGURE&gt;
&lt;HR /&gt;
&lt;H2 style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;Key takeaways&lt;/H2&gt;
&lt;OL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Storage credential, external location, and managed location are three distinct things.&lt;/STRONG&gt; A credential is &lt;EM&gt;how&lt;/EM&gt; to authenticate, an external location is &lt;EM&gt;which path&lt;/EM&gt; it governs, a managed location is &lt;EM&gt;where managed objects land&lt;/EM&gt;.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Managed is the default and the recommendation&lt;/STRONG&gt; for governed analytical tables and volumes: automatic optimization, lower cost, strongest governance, least maintenance.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Managed does not mean lock-in.&lt;/STRONG&gt; Your data stays in your own Azure storage, in open Delta format, reachable through open interfaces.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Managed storage can be physically segregated&lt;/STRONG&gt; by assigning per-catalog or per-schema managed locations. The resolution order is schema &amp;gt; catalog &amp;gt; metastore.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;You control the container boundary, UC controls the layout inside it.&lt;/STRONG&gt; If a requirement is about the container or path boundary, managed meets it. If it is about exact directory naming or external-tool path access, that is where external fits.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;External is the right tool for landing zones, file interchange, register-in-place, and non-Databricks engines.&lt;/STRONG&gt; It costs you the automatic optimizations and opens a path-access governance gap, so scope it deliberately.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;To create external storage you need two privileges:&lt;/STRONG&gt; &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE STORAGE CREDENTIAL&lt;/CODE&gt; for the credential, and &lt;CODE style="font-family: 'SF Mono', Monaco, Consolas, monospace; background: #F0F4F6; padding: 2px 6px; border-radius: 4px; font-size: 14px;"&gt;CREATE EXTERNAL LOCATION&lt;/CODE&gt; on both the metastore and the credential for the location.&lt;/LI&gt;
&lt;LI style="margin-bottom: 12px;"&gt;&lt;STRONG&gt;Keep managed and external in separate dedicated containers.&lt;/STRONG&gt; They cannot overlap, so plan the container layout before you start.&lt;/LI&gt;
&lt;/OL&gt;
&lt;HR /&gt;
&lt;H2 id="references" style="font-size: 26px; font-weight: bold; color: #1b3139; margin: 32px 0 16px; padding-bottom: 8px; border-bottom: 3px solid #FF3621; display: inline-block;"&gt;References&lt;/H2&gt;
&lt;P style="margin: 16px 0;"&gt;Official Azure Databricks documentation:&lt;/P&gt;
&lt;UL style="padding-left: 24px; margin: 0 0 16px;"&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/managed-storage" target="_blank" rel="noopener"&gt;Specify a managed storage location in Unity Catalog&lt;/A&gt;: metastore, catalog, and schema managed locations; resolution order.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/tables/managed" target="_blank" rel="noopener"&gt;Managed tables&lt;/A&gt;: default table type, automatic optimization, lifecycle.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/tables/external" target="_blank" rel="noopener"&gt;External tables&lt;/A&gt;: when to use, path control, lifecycle responsibilities.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/external-locations" target="_blank" rel="noopener"&gt;Create an external location&lt;/A&gt;: concepts and requirements.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/manage-external-locations" target="_blank" rel="noopener"&gt;Manage external locations&lt;/A&gt;: grants (READ FILES, WRITE FILES, CREATE EXTERNAL TABLE/VOLUME, CREATE MANAGED STORAGE).&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/storage-credentials" target="_blank" rel="noopener"&gt;Create a storage credential for ADLS&lt;/A&gt;: UI, CLI, API, and Terraform paths.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/connect/unity-catalog/cloud-storage/azure-managed-identities" target="_blank" rel="noopener"&gt;Use Azure managed identities with the Access Connector&lt;/A&gt;: access connector and Storage Blob Data Contributor role.&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-location" target="_blank" rel="noopener"&gt;CREATE EXTERNAL LOCATION (SQL reference)&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-catalog" target="_blank" rel="noopener"&gt;CREATE CATALOG (SQL reference)&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 8px;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/sql/language-manual/sql-ref-syntax-ddl-create-schema" target="_blank" rel="noopener"&gt;CREATE SCHEMA (SQL reference)&lt;/A&gt;&lt;/LI&gt;
&lt;LI style="margin-bottom: 0;"&gt;&lt;A style="color: #ff3621;" href="https://learn.microsoft.com/en-us/azure/databricks/data-governance/unity-catalog/manage-privileges/privileges" target="_blank" rel="noopener"&gt;Unity Catalog privileges and securable objects&lt;/A&gt;&lt;/LI&gt;
&lt;/UL&gt;
&lt;/DIV&gt;</description>
      <pubDate>Mon, 29 Jun 2026 16:46:42 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/managed-vs-external-storage-in-unity-catalog-on-azure-where/m-p/160880#M1327</guid>
      <dc:creator>Ashwin_DSA</dc:creator>
      <dc:date>2026-06-29T16:46:42Z</dc:date>
    </item>
    <item>
      <title>Re: Managed vs External Storage in Unity Catalog on Azure: Where Should Your Data Live?</title>
      <link>https://community.databricks.com/t5/community-articles/managed-vs-external-storage-in-unity-catalog-on-azure-where/m-p/160936#M1331</link>
      <description>&lt;P&gt;Hi Ashwin,&lt;/P&gt;&lt;P&gt;Really clean write-up - the schema override demo with the actual DESCRIBE DETAIL output is what makes it click. Most posts on this topic stop at "here's the theory," this one actually shows it happening.&lt;/P&gt;&lt;P&gt;Something similar came up on a SAP HANA to Databricks migration I worked on, with a slight twist on the landing zone side.&lt;/P&gt;&lt;P&gt;We had two paths feeding into Bronze - Oracle GoldenGate pushing CDC events through Kafka into Structured Streaming, and a separate JDBC job handling the historical backfill. Both needed to write to a fixed path before Databricks touched anything. GoldenGate especially - it was configured to drop files at a specific ADLS location and that path had to just exist, stable, regardless of what we were doing inside Unity Catalog. So, the landing zone ahead of Bronze ended up external, basically your "fixed path, register-in-place" case exactly.&lt;/P&gt;&lt;P&gt;Once Structured Streaming picked those files up and wrote them into Bronze, everything from there on was managed. Honestly that was one of the better decisions - predictive optimization and auto VACUUM just ran on their own, one less job we had to maintain. By Gold, everything was managed, partitioned by company code and fiscal year, Z-ordered on the columns that got hit hardest in joins.&lt;/P&gt;&lt;P&gt;So, for us it landed as: external just for that one pre-bronze hop, managed for everything after. Curious if your banking customer's CDC setup let them skip that step entirely and write straight into a managed volume, or if they hit the same fixed-path constraint we did.&lt;/P&gt;</description>
      <pubDate>Tue, 30 Jun 2026 10:33:42 GMT</pubDate>
      <guid>https://community.databricks.com/t5/community-articles/managed-vs-external-storage-in-unity-catalog-on-azure-where/m-p/160936#M1331</guid>
      <dc:creator>savlahanish27</dc:creator>
      <dc:date>2026-06-30T10:33:42Z</dc:date>
    </item>
  </channel>
</rss>

