CONCEPT Cited by 1 source
Schema discovery vs data access separation¶
A data-platform governance affordance in which users can see
what tables exist (their names, possibly some lineage and
ownership metadata) but cannot see column-level information or
data for tables / columns they haven't been authorised for.
DESCRIBE, SHOW COLUMNS, and SELECT * honour the access
boundary; bare table-name discovery does not.
Canonical wiki instance¶
Cloudflare Town Lake, from the 2026-05-28 launch post:
"We separate schema discovery from data access. Users can see what tables exist, but unreviewed columns are hidden from
DESCRIBEandSHOW COLUMNSand fromSELECT *. That subtle distinction matters: it means a new unreviewed column doesn't break existing dashboards built on the rest of an approved table."
Why the separation matters¶
The structural argument is dashboard / pipeline stability under
governance churn. Without this separation, every new column
added to an existing table — even if no one queries it yet —
would change SELECT * results and break consumers that rely on
column ordering or schema introspection.
Two concrete failure modes the separation prevents:
SELECT *schema drift — a dashboard that didSELECT * FROM dim.accountswould break the moment a new column lands, until that column completes review. The separation lets new columns enter as invisible toSELECT *until reviewed, while existing approved columns continue to be returned.DESCRIBE-driven validation — pipelines that introspect schemas (e.g., dbt-style downstream validation) would see "new column" signals before review is complete, potentially triggering false alerts or pipeline reroutes.
What "schema discovery" still exposes¶
The Town Lake post doesn't enumerate the line precisely, but the affordances that survive across the access boundary are implicitly:
- Table existence — "users can see what tables exist."
- Table-level lineage / ownership / tags — DataHub-resident metadata on the table as a whole.
- The fact that columns exist (count, possibly names) — enough for self-serve permission requests to be meaningful ("ask for access to this table because it has the column you need").
What's hidden:
- Column-level details for unreviewed columns —
DESCRIBE TABLEandSHOW COLUMNSfilter unreviewed entries out. - Column data —
SELECT *won't return them.
Engine-level mechanism (Trino)¶
In Town Lake's implementation, the enforcement runs through Lifeguard's JSON policy (served to Trino over HTTP). Trino's column-level authorisation is the engine-side substrate; Lifeguard supplies the per-column allow / deny / pending state, and Trino filters schema-introspection results accordingly.
Why default-closed governance depends on this¶
Without separation, default-closed becomes operationally hostile. Every schema migration would break dashboards until the review queue caught up. Teams would either:
- Delay schema migrations (slow data engineering velocity), or
- Skip review for new columns (defeats the governance posture).
The separation lets new columns enter the platform invisibly — discoverable as "there's something here, ask for access if you want it" but not breaking any existing approved-column consumer.
This makes the separation a load-bearing affordance for default-closed table allowlisting — it's the property that keeps the governance posture sustainable at organisational scale.
Seen in¶
- sources/2026-05-28-cloudflare-how-we-built-cloudflares-data-platform-and-an-ai-agent-on-top-of-it
— canonical wiki instance. Town Lake's
DESCRIBE/SHOW COLUMNS/SELECT *filtering as the engine-level expression of the separation.
Related¶
- concepts/default-closed-table-allowlist — the broader governance posture this affordance enables.
- concepts/security-model-as-data-model — Skipper's authority-inheritance shape that composes with this.
- concepts/governance-travels-with-resources — Databricks framing of metadata + access binding to the data itself.
- systems/cloudflare-town-lake — canonical wiki instance.
- systems/cloudflare-lifeguard — the enforcement layer.
- systems/trino — the engine that filters introspection output.
- patterns/default-closed-allowlist-with-automated-pii-scan — the broader implementation pattern.