Data lineage · guide · updated October 2026

Microsoft Fabric lineage, table by table, from the code

Fabric's lineage view tells you that a notebook and a lakehouse are related. It does not tell you which of the lakehouse's tables that notebook writes, or from which line. That is the question people actually ask when a number looks wrong.

What Fabric shows you today

Each workspace has a lineage view, and the OneLake catalog shows lineage per item. Both work at the item level: a pipeline, a notebook, a lakehouse, a semantic model, a report, and arrows between them. That is useful for an overview, but a lakehouse with 200 tables is one box, and the arrow from a notebook to it does not say which tables the notebook touches.

How to find what writes a table by hand

  1. Read the Delta log. In the lakehouse, open Tables/<table>/_delta_log. Each commit's commitInfo has the operation (WRITE, MERGE, CREATE OR REPLACE TABLE AS SELECT) and the engineInfo — Spark, the SQL engine, or the mashup engine for Dataflow Gen2. That tells you what kind of item wrote it, not which one.
  2. Search the code. Look for the table name in notebooks (saveAsTable, .save(path), %%sql, MERGE INTO), in pipeline Copy activities' sinks, and in dataflow destinations. Remember paths built from variables: f"{lakehouse_abfss}Tables/bronze/{table}" will not match a plain text search.
  3. Follow the configuration. Metadata-driven notebooks read their target from a %run config notebook, a parameter cell, a pipeline parameter or a Variable Library. You have to resolve those by hand, per environment.
  4. Check the job history to match commit times with item runs when the code is ambiguous.

It works for one table. It does not scale to an estate, and it is out of date the day after.

How Fabriscope does it

Fabriscope reads the definitions of every notebook, pipeline, dataflow, eventstream and warehouse in the workspaces you choose and parses them: PySpark and Spark SQL, T-SQL, Data Factory JSON and M. It follows %run notebooks, parameter cells, the parameters a pipeline passes, Variable Libraries and the workspace a notebook runs in, so config[env] resolves to the lakehouse it really is.

It is read-only and reads metadata only: definitions, schemas and the Delta log, never a row of your data.

A table's page in Fabriscope: what writes it, the code, and what reads it.
A table's page in Fabriscope: what writes it, the code, and what reads it. The real app, on a sample tenant.

Questions

Does Fabric have table-level lineage?

Fabric's lineage view and the OneLake catalog show lineage between items. Which table a notebook writes, and from which line of code, is not shown; Fabriscope derives it from the code.

Does it need Contributor?

Reading notebook, pipeline and dataflow code goes through Microsoft's getDefinition API, which requires Contributor on the workspace even though nothing is written. Fabriscope never calls a write API.

See it on your own tenant

Read-only, metadata only. About 15 minutes to set up; the trial covers up to 40 workspaces for 7 days.

Start the 7-day trial