---
title: "dbt exposures built on views or raw sources | Metacenta"
description: "A dbt exposure on a view re-runs its SQL on every dashboard load, and one on a raw source skips the project entirely. Which parents we flag, and why."
url: "https://metacenta.com/rules/exposure-parent-not-materialized"
updated: "2026-10-14"
tokens: 645
---

Modelling correctness · rule exposure-parent-not-materialized

# dbt exposures built on views or raw sources

A Metacenta review checks this under the rule **Exposures are built on physical tables**. Everything below applies whether or not you ever commission one.

## What this rule checks

This rule flags exposures that read a raw source directly, or a model built as `view` or `ephemeral`. Every other materialisation passes. A model whose manifest gives no materialisation is left out rather than guessed at.

## Why it matters

An exposure on a raw source shows users data the project never modelled, so none of its tests or documentation apply. An exposure on a view re-runs the upstream SQL on every load, which adds latency and warehouse cost.

## How to fix it

**Build exposures on physical tables.** Model any raw source and point the exposure at the result. Materialise the models behind the exposure as `table` or `incremental`.

Before:

```yaml
exposures:
  - name: weekly_revenue
    type: dashboard
    depends_on:
      - source('shop', 'orders')
```

After:

```yaml
exposures:
  - name: weekly_revenue
    type: dashboard
    depends_on:
      - ref('fct_orders')
```

## When it is fine to leave

A view over a small table is a fair trade when the dashboard is read rarely, or must show rows the moment they land. We rate that case low at medium confidence. An exposure on a raw source has no such case.

## What we need to check it

`manifest.json` alone. A project with no exposures declared is not judged here.

## Published rules it corresponds to

**[dbt_project_evaluator](https://dbt-labs.github.io/dbt-project-evaluator/)**, rule `fct_exposure_parents_materializations`. Ours checks the same condition and threshold.

This means our check corresponds to their rule. It does not mean the publisher reviewed or endorses it.

[Ask about a review](https://metacenta.com/enquire?src=rule-exposure-parent-not-materialized&via=md)

## Related pages

- [dbt incremental models: how unique_key works](https://metacenta.com/rules/incremental-without-unique-key)
- [dbt public models with no enforced contract](https://metacenta.com/rules/public-model-without-contract)
- [dbt sources declared twice for one table](https://metacenta.com/rules/duplicate-source)
- [dbt staging models: how to set up the staging layer](https://metacenta.com/rules/staging-depends-on-staging)
- [A sample review, as a client reads it](https://metacenta.com/sample)
- [All published rules](https://metacenta.com/rules)
- [How a review is assessed](https://metacenta.com/standard)
