Delta Sharing in Practice: Setting Up Cross-Organization Data Exchange

Delta Sharing was announced at Summit last year and has been in use at various scale since. Now that Unity Catalog is generally available and Delta Sharing is integrated directly into UC, the practical setup story is cleaner than it was when I wrote about the announcement. Here's what the end-to-end setup actually looks like today.

The Provider Setup

If you're using Unity Catalog (you should be at this point), Delta Sharing is already available. You don't need a separate Delta Sharing server — Databricks hosts it as part of the UC infrastructure.

-- Create a share
CREATE SHARE partner_analytics
COMMENT 'Aggregated sales data shared with PartnerCo — read-only, refreshed nightly';

-- Add tables to the share
-- The recipient sees the data as it is at query time — always fresh
ALTER SHARE partner_analytics
ADD TABLE prod_analytics.gold.regional_sales_summary;

ALTER SHARE partner_analytics
ADD TABLE prod_analytics.gold.product_category_summary
PARTITION (year = 2022); -- Only share 2022 data

-- Add a specific snapshot using historical versioning
ALTER SHARE partner_analytics
ADD TABLE prod_analytics.gold.annual_report
VERSION AS OF 14; -- Share a specific version, not live data

Creating and Managing Recipients

-- Create a recipient
CREATE RECIPIENT partnerco_analytics_team
COMMENT 'PartnerCo data team — monthly reporting use case';

-- Grant them access to the share
GRANT SELECT ON SHARE partner_analytics TO RECIPIENT partnerco_analytics_team;

-- Get the activation link — send this to the recipient
DESC RECIPIENT partnerco_analytics_team;
-- Returns: name | comment | sharing_code | activation_link | ...

-- The activation_link is a one-time URL
-- The sharing_code is a short human-readable code for verification

Monitoring What Recipients Are Reading

-- What tables has a recipient accessed?
SELECT *
FROM prod_analytics.information_schema.recipient_allowed_tables
WHERE recipient_name = 'partnerco_analytics_team';

-- Delta Sharing access audit via system tables
SELECT *
FROM system.access.audit
WHERE action_name = 'deltaSharingQueryTable'
AND request_params.recipient = 'partnerco_analytics_team'
ORDER BY event_time DESC
LIMIT 100;

The Recipient Side (Open Protocol)

Recipients don't need Databricks. The Delta Sharing client is open source and available for Python, pandas, Spark, Power BI, and others:

import delta_sharing

# The profile file they receive after activating the link
profile = "/path/to/profile.share"
client = delta_sharing.SharingClient(profile)

# List what's available
shares = client.list_shares()
tables = client.list_all_tables()
for table in tables:
print(f"{table.share}.{table.schema}.{table.name}")

# Read as pandas — no Spark required
df = delta_sharing.load_as_pandas(
f"{profile}#partner_analytics.gold.regional_sales_summary"
)

# Read as Spark DataFrame
spark_df = delta_sharing.load_as_spark(
f"{profile}#partner_analytics.gold.regional_sales_summary"
)

Revoking Access

-- Remove access from a recipient
REVOKE SELECT ON SHARE partner_analytics FROM RECIPIENT partnerco_analytics_team;

-- Drop the recipient entirely (immediate effect)
DROP RECIPIENT partnerco_analytics_team;

The integration with UC means access control is unified — the same permission model that governs your internal tables governs what you share externally. When you drop the recipient, the next query attempt by the partner fails with an authentication error. No stale credentials, no export files floating around in someone's S3 bucket. As always, I'm here to help.

Read more