Identify and Resolve Fabric Errors: Pipelines, Dataflows, Notebooks, and More
You resolve Fabric errors by reading the error message where the item records it — the failed activity's output in a pipeline run, the per-table entry in a Dataflow Gen2 refresh history, the cell output and driver log of a notebook, the result of .show ingestion failures in an Eventhouse, the runtime logs of an Eventstream, the error number returned by a T-SQL statement, and the access or path failure surfaced when a OneLake shortcut is opened — then classifying the failure as authentication, connectivity, schema or data, resource, or logic, and applying the fix that class implies. DP-700 gives this an entire skill area because each item type fails in characteristic ways with its own diagnostic surface. This lesson works through the common failure classes, the settings and behaviours behind them (activity timeouts and dependency conditions, gateway ports, environments and parameter injection, update policies, snapshot isolation, shortcut authentication models) for all seven item types the study guide names, gives you a systematic troubleshooting method, and ends with an error-to-cause-to-fix table you can rehearse before the exam.
On this page11 sections
- A systematic troubleshooting method
- Pipeline errors: activities, retries, and timeouts
- Pipeline logic errors: activity outputs and dependency conditions
- Dataflow Gen2 errors: refresh, staging, and destination failures
- Notebook errors: Spark exceptions and out-of-memory failures
- Notebook errors in scheduled runs: libraries, parameters, and Spark capacity
- Eventhouse errors: diagnosing ingestion failures with KQL
- Eventstream errors: connectivity and schema mismatches
- T-SQL errors: read-only endpoint, unsupported surface, and write conflicts
- OneLake shortcut errors: authentication model and broken paths
- Error type → likely cause → fix, and a worked scenario
- Apply a systematic method to any Fabric failure: locate the run, read the error, classify it, reproduce it at the smallest scope, fix, and rerun
- Diagnose pipeline activity failures using error details, activity timeout and retry settings, and rerun from the failed activity, drilling from a parent activity into the child notebook or dataflow run
- Resolve pipeline expression and orchestration errors by reading activity output shapes and applying dependency conditions and the Skipped status correctly
- Resolve Dataflow Gen2 refresh errors by isolating the failing table and phase, including gateway port requirements for staged data and type conversion at the destination
- Troubleshoot notebook failures: Spark exceptions, driver versus executor out-of-memory, library and environment errors, parameter injection, and capacity admission (HTTP 430)
- Investigate Eventhouse ingestion failures with .show ingestion failures, update policies and ingestion mappings, and fix Eventstream connectivity and schema errors
- Recognize T-SQL errors in a Warehouse and the SQL analytics endpoint, and diagnose OneLake shortcut failures by authentication model and target path
A systematic troubleshooting method
The method that works across every Fabric item type has six steps, and DP-700 scenarios reward you for following them in order rather than jumping to a fix.
- Locate the failing run. Start in the Monitoring hub (for jobs) or the item's own editor (for continuous items like Eventstreams) and find the failed execution.
- Read the actual error. Drill to the deepest surface available — the failed activity's error details, the failing table in a refresh, the exception in a cell, the failure record from a KQL command. Never diagnose from the top-level status alone. Watch for the opposite trap too: some faults (a Spark job waiting in a queue, an ingestion that writes empty columns) produce no error at all, so a missing result can be the only symptom.
- Classify the failure. Almost every error falls into one of five classes: authentication (expired credentials, missing permission), connectivity (unreachable source, gateway, firewall), schema or data (type mismatch, missing column, malformed rows), resource (out of memory, capacity throttling, timeout), or logic (bad expression, wrong path, wrong query).
- Reproduce at the smallest scope. Preview the failing query on a subset, run the failing cell alone, ingest one file, or execute the T-SQL statement directly. Small reproductions turn a vague run failure into a specific message.
- Fix the class, not the symptom. An expired credential needs a connection update, not a retry policy; a type mismatch needs a schema fix, not more memory.
- Rerun from the failure point and prevent recurrence. Rerun the pipeline from the failed activity, then add retries for genuinely transient classes and an Activator alert so the next failure is heard immediately.
Keep the classification list in your head — the rest of this lesson is those five classes expressed per item type.
Pipeline errors: activities, retries, and timeouts
A pipeline fails at the activity level, so diagnosis always starts by opening the run (from the Monitoring hub or the pipeline's run history) and finding the failed activity's error code and message in its output. The run-level status only tells you that some activity on the executed path failed without a recovery path.
The common failure classes map cleanly:
- Authentication — the connection used by a source or sink has expired or lost permission. The fix is updating the connection's credentials, not editing the pipeline.
- Connectivity — the source is unreachable, or an on-premises source is used without a healthy data gateway. Verify the gateway status and network path.
- Schema and data — a Copy activity hits a column mapping mismatch or a value that will not convert to the destination type. Fix the mapping or the destination schema; for recurring dirty data, adjust the copy settings for handling incompatible rows.
- Resource and transient — throttling from the source, a timeout on a long copy, or a temporary service fault. These are what the activity's general settings exist for. Transient classes deserve retries; deterministic ones (auth, schema) do not — retrying a bad credential three times just fails three times.
- Logic — a dynamic expression evaluates to a wrong path or parameter, or an activity's dependencies route the run the wrong way. These are covered in the next section.
Timeout and retry work together
Every activity has a timeout (default 12 hours, maximum 7 days), a retry count (default 0) and a retry interval (default 30 seconds). A retry starts only after an attempt fails. An activity that hangs rather than fails therefore never triggers its retries until the timeout ends the attempt — with the default, that is 12 hours later. For a call that occasionally stalls, set a timeout just above its normal duration and a retry count, so a stalled attempt is cut off and retried quickly.
Rerun and drill-through
After fixing, use rerun from failed activity so completed upstream work is not repeated. Failures in an invoked child — a Notebook, Dataflow or Invoke pipeline activity — surface on the parent's activity with a summary message; the underlying error lives in the child's own run. For a notebook, follow the activity's link (or find the run in the Monitoring hub) to its Spark application detail page: it holds an item snapshot of the notebook exactly as it ran, including the code, cell outputs and the parameter values the pipeline passed, plus a Logs tab with the driver log (stdout/stderr) and the Spark UI link. For a dataflow, open that dataflow's refresh history and the failing table.
Pipeline logic errors: activity outputs and dependency conditions
Pipeline logic errors come from two places: an expression that reads the wrong part of another activity's output, and dependency wiring that routes the run differently from what you intended. Both are diagnosed from the run's input and output JSON for each activity, which shows expressions after evaluation and the exact shape every activity produced.
Activity output shapes
An expression such as @activity('Name').output… fails, or evaluates to null, when its property path does not match what the activity actually emitted. The shapes to know:
| Activity and setting | Output shape | How downstream expressions read it |
|---|---|---|
| Lookup, First row only on (default) | output.firstRow — a single object | @activity('L').output.firstRow.ColumnName |
| Lookup, First row only off | output.value — an array of rows, plus output.count | A ForEach iterates @activity('L').output.value; a single value needs an index, e.g. output.value[0].ColumnName |
| Get Metadata with Child items selected | output.childItems — an array of {name, type} | A ForEach iterates @activity('G').output.childItems; each file is @item().name |
So toggling First row only, or pointing a ForEach at the Get Metadata output object instead of its childItems array, breaks the expression even though nothing else changed. Open the upstream activity's output JSON in the run to confirm the exact path before editing the expression. (A reference to a misspelled activity name is caught by pipeline validation before the run starts.)
Dependency conditions and the Skipped status
Each dependency arrow between activities carries a condition:
- On success — runs the next activity only if the upstream activity succeeded.
- On fail — runs it only if the upstream activity failed.
- On completion — runs it whether the upstream activity succeeded or failed.
- On skip — runs it only if the upstream activity was Skipped.
An activity is Skipped when its dependency condition is not met — for example, everything after a failed step in an On success chain. When an activity has dependencies on several activities, all of them must be met (the conditions are ANDed); there is no built-in OR across different upstream activities.
The pipeline run's outcome is derived from its leaf activities (activities with nothing downstream). If any leaf fails, the run fails. A skipped leaf takes the outcome of its parent. That gives the two standard patterns their different results:
- Try-catch — a step with only an On fail handler. If the step fails and the handler succeeds, the handler is the leaf and the run succeeds.
- Do-if-else — a step with an On success path and an On fail path. If the step fails, the On fail path succeeds but the skipped On success path takes its failed parent's outcome, so the run fails — which is often what you want, because the failure stays visible.
One error handler for a sequential chain
To catch a failure anywhere in a chain A → B → C, connect the handler to the last activity (C) with both On fail and On skip. If C fails, On fail fires; if A or B failed, C is Skipped and On skip fires. Wiring On fail from every activity does not work, because those dependencies are ANDed and can never all be met. On completion is not an error path: it also fires on success.
Dataflow Gen2 errors: refresh, staging, and destination failures
A Dataflow Gen2 failure is diagnosed from its refresh history: open the failed refresh and find which table (query) and which activity failed, because a dataflow with many queries usually fails in exactly one of them while the rest succeed.
Classify by phase:
- Evaluation errors — the mashup engine could not execute the query: a source credential expired, an on-premises source has no reachable gateway, a source column referenced by a step was renamed or removed, or a step produced an error value. Reproduce by opening the query in the dataflow editor, where the failing step is flagged and you can inspect the error on the exact cell or column.
- Staging errors — dataflows can stage data in a staging Lakehouse before loading it; failures here are usually resource-shaped (very large intermediate results) or environmental. If a query does not need staging, disabling staging for it is a legitimate fix as well as an optimization.
- Load-to-destination errors — the write to the Lakehouse, Warehouse, or other destination failed: a value in the query does not convert to the destination column type, a schema changed so the fixed column mapping no longer matches, or the writer lacks permission on the destination. Fix the query's types, update the destination mapping, or grant the dataflow's destination connection write permission on the target.
Type conversion at the destination
When a column holds values that will not convert to the destination type (for example N/A in a column that loads into a decimal column), fix the data in the query: set the column's type in Power Query (Decimal number) and handle the conversion errors with Replace errors (for example with null) or by removing the error rows. The principle is to make the data fit the contract, not the contract fit the data: the destination column's type is what downstream consumers rely on, and a value only converts once the query itself produces a value of that type. Settings that change how rows move do not change whether a value converts.
On-premises gateway and staged data
With an on-premises data gateway, the gateway does more than read the source. Writing to a Lakehouse destination goes over HTTPS (port 443), but when staging is on, the gateway also reads the staged data back through the staging Lakehouse's SQL analytics endpoint over TCP 1433. If the gateway's network blocks outbound 1433 to *.datawarehouse.fabric.microsoft.com, *.datawarehouse.pbidedicated.windows.net and *.dfs.fabric.microsoft.com, the refresh fails in the WriteToDatabaseTableFrom activity with a socket error (10013) even though the individual tables report Succeeded. Open port 1433 to those endpoints, or, where that is not possible, restructure so the gateway does not need the staged read: combine the queries into one and disable staging and fast copy for it.
Two recurring exam patterns: first, a dataflow that works on demand but fails on schedule is usually an authentication or gateway problem tied to the scheduled context; second, when the error text mentions the destination table rather than the source, stop debugging the source steps — the query evaluated fine, and the types, mapping or destination are the problem.
Notebook errors: Spark exceptions and out-of-memory failures
A notebook fails with an exception in the failing cell's output, and that traceback is your first diagnostic. Read it bottom-up: the last frames name the real cause — an unresolved table or path, a column not found, a schema mismatch on write, a Python or PySpark API misuse.
The failures that need more than the cell output are the resource ones:
- Driver out-of-memory — the classic cause is pulling distributed data onto the driver:
collect()on a large DataFrame,toPandas(), or building huge local objects. Apache Arrow speeds up thetoPandas()conversion, but the mechanism is unchanged: every row still lands in driver memory. The fix is to stop materializing on the driver: aggregate or filter first, write results to a table, or sample. When the reason for pandas was custom Python logic, use pandas UDFs ormapInPandas, which run that logic in pandas on each executor's batch and keep it distributed. - Executor out-of-memory or lost executors — typically skewed or oversized partitions, or an explosive join. Repartition, fix the skewed key, avoid unnecessary wide shuffles, or scale the Spark pool's node size if the workload legitimately needs it. The Spark UI's stage and task view shows the skew: a handful of tasks running far longer or spilling far more than their peers.
Distinguish surfaces the way the exam does: cell output for code and data errors, driver and executor logs for session-level and infrastructure failures, the Spark UI for where memory and time actually went. All three are reachable from the run's Spark application detail page in the Monitoring hub.
Notebook errors in scheduled runs: libraries, parameters, and Spark capacity
Notebooks that work interactively but fail in a pipeline or schedule usually fail for one of three reasons that have nothing to do with the code's logic: a library that is not available in the run, a parameter value that was not applied, or a Spark session that could not start.
Libraries: environments, not inline installs
A ModuleNotFoundError means the package is not in the session. Inline commands such as %pip install and %conda install install into the current session only, so the package disappears when the session ends, and inline installation is disabled by default in pipeline runs (it can be turned on with the _inlineInstallationEnabled parameter, but that reinstalls on every run). The recommended fix is to add the library to an environment (public or custom libraries), publish it, and attach the environment to the notebook or set it as the workspace default — every session, interactive or pipeline, then starts with the library. Library version conflicts surface when the environment is published or the session starts; read the publish log or the driver log.
Parameters: the injected cell
A pipeline's Notebook activity passes base parameters to a notebook whose parameters cell is toggled. At run time Fabric inserts a new cell directly beneath the parameters cell that assigns the passed values. Two consequences:
- Only variables whose names match exactly (case included) are overridden; a mismatched name is simply added as a new variable, and the notebook silently runs with its default.
- Any later cell that assigns the same variable overwrites the pipeline's value. Keep defaults only in the parameters cell.
Supported base parameter types are string, int, float and bool. The run's item snapshot shows the injected cell, so you can confirm what the notebook actually received.
Session start: capacity admission (HTTP 430)
Each capacity has a limit on Spark VCores (with bursting). When a new job needs cores that are not available, the response depends on the job type:
| Job type | When cores are exhausted |
|---|---|
| Interactive notebook sessions | Rejected with HTTP 430 TooManyRequestsForCapacity |
| Notebooks run by pipelines or the scheduler, and Spark job definitions | Queued (first in, first out) and started when cores free up; a queued job expires after 24 hours by default. The queue has a size limit tied to the SKU (for example 64 on F64); once it is full, even these jobs are rejected with 430. Notebooks started through the notebook public API are not queued, and trial capacities do not queue |
| Any job while the capacity is throttled | Rejected — queueing does not apply |
So a 430 is a capacity problem, not a code problem: stop idle interactive sessions, spread job schedules, reduce pool sizes, or scale the capacity. A pipeline notebook that starts late is usually queued, not failing — unless the queue itself is full.
Eventhouse errors: diagnosing ingestion failures with KQL
Eventhouse (KQL database) errors are dominated by ingestion failures, and the diagnostic is a management command: .show ingestion failures returns the failure records retained by default for the last 14 days, including the database and table, the ErrorCode, the failure details, the IngestionSourcePath (which file or blob failed), whether the failure is Permanent or Transient, and OriginatesFromUpdatePolicy (whether an update policy caused it). Filter it with KQL like any table, for example by table name or time.
The failure kind drives the fix. Transient failures (such as General_ThrottledIngestion) are retried by the service and generally resolve. Permanent failures fail every retry until you change something, and the data does not arrive by itself — after fixing the cause you must re-ingest the failed files listed in IngestionSourcePath. The ErrorCode names the cause:
- Mapping errors — for example
BadRequest_MappingReferenceWasNotFound: the ingestion properties name a mapping that was dropped or renamed. Re-create the mapping or reference an existing one. - Format errors — the payload is not the declared format (declared JSON but actually CSV, compressed unexpectedly, or corrupt files).
- Access errors — for example
Download_Forbidden: the service could not read the source blob. Fix the storage access, then re-ingest. Missing database permissions for the ingesting identity fail similarly.
Silent gaps: nulls without failures
Not every data problem is a failure. With direct ingestion through a table's JSON ingestion mapping, a field whose path no longer resolves (the producer renamed it) or a value that no longer converts to the column's type (for example 1,204 ms into a long column) is ingested as an empty (null) value. The row lands, nothing appears in .show ingestion failures, and the only symptom is a column that suddenly goes empty. Fix the mapping path, or clean the value upstream so it converts; there is no error to find.
Update policy failures
An update policy runs a query (often a stored function) over newly ingested source data and writes the result into a target table. Its IsTransactional setting decides what a failure does:
| IsTransactional | When the policy query fails |
|---|---|
| false (default) | The source ingestion succeeds; only the target table misses that data |
| true | The source ingestion fails too, so neither table gets the data |
Find policy failures with .show ingestion failures | where OriginatesFromUpdatePolicy == true. A common cause: editing the function the policy calls (changing its output schema) is not validated against the policy, so the edit succeeds and the policy starts failing on the next ingestion.
Query-side errors are the remaining class: KQL semantic errors (unknown column, wrong operator usage) or queries that exceed limits on very large scans — resolved by correcting the query or narrowing its time range and filters rather than raising limits first.
Eventstream errors: connectivity and schema mismatches
An Eventstream fails at its edges — sources and destinations — and you diagnose it inside the Eventstream editor using data preview, data insights (per-node metrics), and runtime logs, since a continuously running stream has no run history in the Monitoring hub sense.
On the source side, the dominant class is connectivity and authentication: an external source's connection string, key, or credential is wrong or expired, or the network path to the source is blocked. The symptom is a source node showing errors in the runtime logs, or simply no incoming events in data insights. Verify by checking incoming event metrics: if nothing arrives at the first node, stop debugging transformations — the problem is between the source and Fabric.
For an Azure Event Hubs source, the stored connection holds one shared access policy name and one of its two keys. Regenerating that key, or deleting the policy, breaks the Eventstream source while producers (which use their own keys) keep sending happily — events pile up in the event hub but stop arriving in Fabric. Update the connection with the current key. The rule: only a change to the exact policy-and-key pair the connection stores breaks it; changes elsewhere on the namespace or event hub leave it working.
Transformation nodes fail on data shape: an operation references a field that stopped appearing in the events, or a type assumption breaks when a producer changes its payload. Data preview at each node shows exactly where the shape diverges from what the downstream operator expects.
On the destination side, the classic error is a schema mismatch with an Eventhouse destination: the events no longer match the target table's schema or mapping, so events flow through the stream but fail to land. Fix the mapping or table, exactly as with direct Eventhouse ingestion. Lakehouse destinations fail similarly on type conversion into the Delta table.
Also recognize the resource class: a stream whose incoming rate outruns its processing shows growing latency in data insights. That is a throughput problem — addressed by simplifying in-stream operations or scaling — not an error to hunt in logs.
T-SQL errors: read-only endpoint, unsupported surface, and write conflicts
T-SQL errors in a Fabric Warehouse or a Lakehouse SQL analytics endpoint fall into three classes you should name on sight:
- Permission and read-only errors — the caller lacks access to the object: the fix is granting the appropriate permission (
GRANT SELECTand friends), workspace role, or item permission. Separately, the SQL analytics endpoint is read-only for table data, so anyINSERT,UPDATE,DELETEorCREATE TABLEagainst it fails by design; writes to Lakehouse tables happen through Spark, pipelines, or dataflows. Views, functions and permissions can still be created there. - Unsupported-surface errors — a statement, constraint or data type the Warehouse does not support. These need a rewrite, never a retry (see below).
- Transaction and conflict errors — see write-write conflicts below.
Unsupported surface: constraints and data types
Fabric Warehouse implements a subset of SQL Server's T-SQL. PRIMARY KEY and UNIQUE constraints are supported only as NONCLUSTERED and NOT ENFORCED, added with ALTER TABLE … ADD CONSTRAINT after the table exists, not inline in CREATE TABLE; foreign keys are likewise NOT ENFORCED. Several familiar column types are unsupported in tables, each with a standard replacement:
| Unsupported type | Use instead |
|---|---|
money, smallmoney | decimal |
datetime, smalldatetime | datetime2 |
nchar, nvarchar | char, varchar (UTF-8 collation) |
tinyint | smallint |
text, ntext | varchar |
image | varbinary |
xml | No equivalent — store the markup as varchar text only if XML methods and validation are not needed |
Write-write conflicts
Fabric Warehouse runs every transaction under snapshot isolation; a statement that sets another isolation level is ignored. Conflicts are detected at the table level: two transactions that modify the same table concurrently conflict even if they touch different rows. The first to commit wins; the other fails and rolls back with error 24556 or 24706. Because detection is per table and the isolation level is fixed, the fix works on timing: retry logic around the losing transaction, and scheduling or serializing writers to the same table.
OneLake shortcut errors: authentication model and broken paths
A shortcut holds no data, so its errors are always about the target or the identity used to reach it. Which identity that is depends on the shortcut type:
| Shortcut | Identity checked at the target | Typical failure pattern |
|---|---|---|
| External (ADLS Gen2, Amazon S3, etc.) | The credential stored in the shortcut's cloud connection (account key, SAS, service principal or organizational account) — the same for every user | Fails for everyone when the credential expires, is rotated or loses rights |
| OneLake, passthrough (the default for same-tenant OneLake targets) | The caller's own identity | Works for some users, access denied for others who lack permission on the target item |
| OneLake, delegated identity (chosen at creation) | The shortcut's connection identity; the user's own security still applies on the consumer side | Fails for everyone if the connection identity loses access to the target |
Consequences worth knowing. Because an external shortcut reads with its connection's credential, granting individual users roles on the storage account does not fix a credential failure — update the connection. For passthrough shortcuts, fix the user's permission on the target item, not on the item that holds the shortcut. And the engine matters: a Lakehouse SQL analytics endpoint in delegated identity mode reads shortcut targets with the item owner's identity, while Spark passes the caller's. A user who lacks access to the target can therefore query a shortcut table through SQL and still get access denied reading it from a notebook; the fix is read access for the user at the target.
Path failures are the other class. If one shortcut reports not found while other shortcuts that use the same credential still read fine, authentication is not the problem — the target folder was moved, renamed or deleted in storage. Shortcuts do not follow such changes. Edit the shortcut's target path (or delete and re-create it with the same name, so code that references it keeps working).
Error type → likely cause → fix, and a worked scenario
Rehearse this table — it compresses the whole topic into the exam's question shape.
| Error type | Likely cause | Fix |
|---|---|---|
| Pipeline activity fails intermittently | Transient source fault or throttling | Configure activity retry count and interval; rerun from failed activity |
| Pipeline activity hangs for hours before failing | Default 12-hour timeout; retries wait for a failed attempt | Set a realistic timeout plus a retry count |
| Expression fails or returns null after a Lookup or Get Metadata | Wrong output path (firstRow vs value, childItems) | Read the activity output JSON; fix the property path |
| Error handler never runs after an early failure | Later activities were Skipped; dependencies are ANDed | Connect the handler from the last activity with On fail and On skip |
| Pipeline Copy activity type/mapping error | Source schema drift vs sink mapping | Update column mapping or destination schema |
| Dataflow Gen2 fails on schedule, works on demand | Credential or gateway issue in scheduled context | Update connection credentials; verify gateway health |
| Dataflow Gen2 destination write error | Query output type incompatible with destination column | Fix query data types or destination mapping |
| Dataflow Gen2 fails in WriteToDatabaseTableFrom via a gateway | Gateway can't reach the staging SQL endpoint on TCP 1433 | Open outbound 1433 to the Fabric endpoints, or avoid the staged read |
| Notebook driver out-of-memory | collect() / toPandas() on large data | Keep work distributed; aggregate or write to a table instead |
| Notebook executor out-of-memory / lost | Partition skew or explosive join | Repartition, fix skewed keys; scale pool only if legitimately needed |
| Notebook ModuleNotFoundError only in pipeline runs | Inline %pip installs are session-scoped and disabled in pipelines | Add the library to an environment and attach it |
| Notebook ignores a pipeline parameter | Name mismatch, or a later cell reassigns the variable | Match names exactly; keep defaults only in the parameters cell |
| Interactive session fails with HTTP 430 | Capacity Spark VCores exhausted | Free or scale capacity; pipeline and scheduled jobs queue (up to the SKU's queue limit) instead |
| Eventhouse permanent ingestion failure | Ingestion mapping or schema mismatch, bad format | Inspect .show ingestion failures; correct mapping, schema, or format |
| Eventhouse column suddenly empty, no failures | JSON mapping path no longer resolves, or value won't convert | Fix the mapping path or clean the value upstream |
| Target table missing data, source table fine | Non-transactional update policy failing | Filter failures on OriginatesFromUpdatePolicy; fix the policy function |
| Eventstream events not arriving | Source connection credential or endpoint error | Fix source connection; confirm incoming metrics in data insights |
| Eventstream destination not receiving | Schema mismatch with Eventhouse table or Lakehouse types | Align table schema/mapping with event shape |
| T-SQL write fails on SQL analytics endpoint | Endpoint is read-only by design | Write via Spark, pipeline, or dataflow; query via the endpoint |
| T-SQL transaction rolled back (24556/24706) | Table-level snapshot isolation conflict between concurrent writers | Retry; schedule conflicting writers apart |
| Shortcut access denied for some users | Internal shortcut checks caller's permission on target | Grant permission on the target item |
| Shortcut suddenly unreadable for everyone | External connection credential expired, or target path moved/deleted | Update the connection, or recreate the shortcut to the current path |
| Shortcut access differs by engine for the same user | SQL endpoint in delegated mode reads targets as the item owner; Spark reads as the user | Grant the user read access at the target |
Scenario: a nightly pipeline runs a notebook that reads an ADLS Gen2 shortcut and writes a Lakehouse table; it has failed for two nights. The notebook activity shows a failure; drilling into the notebook run, the cell throws an access error on the shortcut path. Classify: authentication — and because it fails for every identity, it is the shortcut's external connection, not a user permission. The storage key used by the connection was rotated. Fix the connection's credential, rerun the pipeline from the failed activity, and add an Activator rule on failed job events so the next credential rotation is caught the same night.
Tip. DP-700 tests this skill with symptom-to-cause scenarios: an error message or behaviour pattern is described and you pick the cause or the fix. Trigger words include rerun from failed activity, timeout and retry (pipelines), firstRow, value and childItems (activity output paths), On fail, On skip and Skipped (dependency conditions and run outcome), fails on schedule but works on demand and port 1433 (dataflow credentials or gateway), collect or toPandas (driver OOM), ModuleNotFoundError and environments, parameters cell (notebook parameters), HTTP 430 (Spark capacity), .show ingestion failures, permanent versus transient and IsTransactional (Eventhouse), regenerated keys (Eventstream sources), schema mismatch at the destination (Eventstream), read-only endpoint, NOT ENFORCED and write-write conflict (T-SQL), and passthrough versus delegated identity (shortcuts). Expect multi-item chains where you trace a parent pipeline failure through a child notebook or dataflow to the true underlying error.
- Classify every failure into one of five classes — authentication, connectivity, schema/data, resource, or logic — and fix the class, not the symptom.
- Pipelines fail at the activity level: read the error and the input/output JSON, pair a realistic timeout (default 12 hours) with retries for transient faults, rerun from the failed activity, and drill into a child notebook through its Spark application detail page.
- Expressions must match the output shape (Lookup firstRow vs value, Get Metadata childItems); dependencies on several activities are ANDed, a skipped leaf takes its parent outcome, and one handler on the last activity with On fail + On skip catches a whole chain.
- Dataflow Gen2 diagnosis is table-by-table and phase-by-phase: fix unconvertible values in the query (type + replace errors), and give a gateway outbound TCP 1433 for staged reads.
- Notebook driver OOM means data was pulled local (Arrow speeds the transfer but rows still land on the driver; pandas UDFs keep logic distributed); libraries belong in environments, pipeline parameters need exact names, and HTTP 430 means Spark capacity is exhausted.
- Eventhouse: .show ingestion failures (14 days) gives ErrorCode, source path and Permanent/Transient; permanent failures need a fix and re-ingestion, non-transactional update policies fail silently into the target, and broken JSON mappings ingest nulls with no failure.
- Eventstreams fail at their edges: a regenerated Event Hubs key breaks the stored connection while producers keep sending; schema changes break the destination.
- Warehouse: snapshot isolation only, table-level write conflicts (24556/24706) need retries; constraints are NONCLUSTERED NOT ENFORCED and types like money, datetime and nvarchar need replacements. The SQL analytics endpoint is read-only.
- Shortcut errors depend on the identity used: external and delegated shortcuts fail for everyone on the connection, passthrough shortcuts on the caller's target permission; a not-found while other shortcuts on the same credential still work means the target path moved.
Frequently asked questions
How do I find out why data stopped arriving in a KQL database table?
Run .show ingestion failures in the database (it keeps 14 days of records) and read the rows for the table: the ErrorCode and details identify the cause, IngestionSourcePath names the failed file, and each record is marked Permanent or Transient. Transient failures are retried by the service; permanent ones recur until you fix the mapping, format or access problem and then re-ingest the failed files. If nothing is recorded but a column has gone empty, check the ingestion mapping: a JSON path that no longer resolves ingests nulls without a failure.
How do I make one error handler catch a failure anywhere in a sequence of pipeline activities?
Connect the handler to the last activity in the chain with both On fail and On skip. If the last activity fails, On fail fires; if an earlier one failed, the later activities are Skipped and On skip fires. Wiring On fail from every activity does not work, because dependencies on several activities must all be met, and On completion is not an error path because it also fires on success.
Why does my Dataflow Gen2 fail on its schedule but succeed when I refresh it manually?
That pattern almost always indicates an authentication or gateway problem in the scheduled context rather than a query bug: a stored credential has expired or an on-premises gateway is unavailable at run time. Update the connection's credentials and verify the gateway, then check the refresh history's failing table entry to confirm the error class.
Why does a notebook fail with ModuleNotFoundError when a pipeline runs it, but not interactively?
Packages installed inline with %pip or %conda exist only in the session that installed them, and inline installation is disabled by default in pipeline runs. Add the library to a Fabric environment, publish it, and attach the environment to the notebook (or make it the workspace default), so every session — interactive or pipeline — starts with the library.
What is the difference between driver and executor out-of-memory in a Fabric notebook?
Driver OOM means too much data was materialized on the single driver node — usually collect(), toPandas(), or large local objects — and the fix is keeping the work distributed. Executor OOM means individual workers ran out of memory processing their partitions, usually from skewed keys or oversized partitions; repartition and address the skew first, and scale the Spark pool only if the workload genuinely needs more memory.
Why can one user read through a OneLake shortcut while another gets access denied?
For internal OneLake shortcuts, access is evaluated against the calling user's permission on the target item, not the shortcut itself — so a user without rights on the target gets denied even though the shortcut sits in an item they can access. Grant the user permission on the target. If a shortcut fails for everyone, suspect the external connection's credential or a moved or deleted target path instead.
Why do INSERT statements fail against my Lakehouse in T-SQL?
The Lakehouse's SQL analytics endpoint is read-only by design: it exposes the Delta tables for T-SQL querying, but writes must go through Spark notebooks, pipelines, or Dataflow Gen2. If you need full T-SQL write capability, the data belongs in a Warehouse, where DML is supported.
When should I add a retry policy instead of fixing the error?
Only for genuinely transient classes: source throttling, temporary network faults, snapshot isolation conflicts, or momentary service unavailability. Deterministic failures — expired credentials, schema mismatches, permission gaps, logic errors — fail identically on every retry, so retrying them only delays the alert. Classify first, then decide.
Source
This lesson covers the "Monitor and optimize an analytics solution" domain of the official DP-700 exam guide. Vendors revise their guides — check the source for the current version.
- Microsoft DP-700 study guide — Microsoft Learn
Sign up free to mark lessons complete, bookmark topics and track your exam readiness.