The privilege chain
To read main.sales.orders, a user (or a group they belong to) needs all three:
GRANT USE CATALOG ON CATALOG main TO `analysts`;
GRANT USE SCHEMA ON SCHEMA main.sales TO `analysts`;
GRANT SELECT ON TABLE main.sales.orders TO `analysts`;
Missing the USE CATALOG or USE SCHEMA grant is the most common cause of PERMISSION_DENIED, even when SELECT was granted.
You can grant at a higher level to cover current and future objects:
GRANT SELECT ON SCHEMA main.sales TO `analysts`; -- all tables and views in the schema, including new ones
Check what's granted
SHOW GRANTS ON TABLE main.sales.orders;
SHOW GRANTS `jane@contoso.com` ON SCHEMA main.sales;
DESCRIBE TABLE EXTENDED main.sales.orders; -- owner, location, type
Error messages
| Error | Meaning |
|---|---|
User does not have USE CATALOG on Catalog 'main' | Grant USE CATALOG |
User does not have SELECT on Table ... | Grant SELECT (or at schema level) |
User does not have MODIFY on Table | Writes need MODIFY |
does not have CREATE TABLE on Schema | Grant CREATE TABLE on the schema |
PERMISSION_DENIED: ... READ FILES on External Location | Path-based access to cloud storage. See below. |
Table or view not found | Wrong name, or the user can't even see it. The same error hides unauthorized objects. |
External locations and files
Reading files by path (read_files('abfss://...'), COPY INTO, external tables) goes through external locations:
SHOW EXTERNAL LOCATIONS;
GRANT READ FILES ON EXTERNAL LOCATION raw_landing TO `data_engineers`;
GRANT WRITE FILES ON EXTERNAL LOCATION raw_landing TO `data_engineers`;
The external location uses a storage credential (managed identity or IAM role). That identity needs the cloud storage permissions, such as Storage Blob Data Contributor on Azure or S3 permissions on AWS.
Compute access mode matters
- Unity Catalog works on standard (formerly shared) and dedicated (formerly single user) access modes, and on SQL warehouses and serverless.
- No isolation shared clusters can't use Unity Catalog. Users see only
hive_metastore. - On a dedicated cluster assigned to one user, that user's permissions apply, even if someone else runs the notebook.
Ownership and groups
- An object's owner has all privileges on it. Transfer ownership to a group, not to an individual who might leave:
ALTER TABLE main.sales.orders OWNER TO `data_platform_admins`; - Grant to account-level groups (synced from Entra ID or your IdP), not workspace-local groups.
Tip
Turn on system tables (
system.access.audit) and query recentPERMISSION_DENIEDevents. They show the exact privilege and object each user was missing.