Say this first: The system.access audit tables record Delta Sharing activity on the provider side, including the recipient, the share, and the object accessed.
Remember these
- Provider-side system.access tables record sharing reads per recipient
- Open sharing shows the recipient, not the individual on their side
- Audit schemas must be enabled per metastore and do not backfill
- Persist the monthly report so it outlives audit retention
Why: Because every read goes through the sharing server for permission and URL issuance, the provider sees each access and it is recorded in the audit tables under the system.access schema. You can group by recipient and shared object to produce exactly the report compliance wants, and you can spot patterns like a recipient pulling the whole table nightly. The limits are worth stating: the audit records recipient-level activity, so with open sharing you see the recipient, not which human on their side ran the query, whereas Databricks-to-Databricks sharing carries more identity detail. Audit tables also need their schema enabled on the metastore and have no backfill, so if this is a contractual requirement, enable it before the first contract rather than after the first audit. Build the report as a scheduled query over the audit tables and keep its output, so you are not dependent on audit retention.
SELECT request_params.recipient_name, request_params.share, COUNT(*) AS reads
FROM system.access.audit
WHERE service_name = 'unityCatalog' AND action_name ILIKE '%deltaSharing%'
AND event_date >= current_date() - INTERVAL 30 DAYS
GROUP BY ALL
Senior depth: I set this up before signing rather than after, because audit tables do not backfill and 'we will produce it when asked' quietly means 'we cannot produce last quarter'. Practically: enable the audit schema on the metastore, run a scheduled job that snapshots recipient activity into a retained reporting table, and reconcile it monthly against the active contracts. If a partner needs per-user attribution, that is an argument for Databricks-to-Databricks sharing or for per-team recipients rather than one shared credential, and it is cheaper to make that a contract term than a retrofit.
Common mistake: Promising per-end-user attribution for an open-sharing recipient, where you only see the recipient identity.
Follow-up they will ask: How would you get per-user attribution for a partner who insists on it?