Synapse Migration
MicrosoftOfficialPublished by Microsoft
- Skill
- Workflow
- Software development
- MIT
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
The synapse-migration skill provides a structured, phased workflow for transitioning Synapse Analytics workspaces to Microsoft Fabric. It covers the migration of Spark items, Lake Databases, Linked Services, and Dedicated SQL Pool schema and stored procedures. The skill emphasizes a dependency-ordered approach, requiring gap assessment and explicit approval before conversion. It distinguishes between migrating to a Fabric Lakehouse (schema and code only, no data movement) and a Fabric Warehouse, while providing specific routing for dependent pipeline callers.
What it does
- Discovers and classifies Synapse workspace artifacts.
- Converts Dedicated SQL Pool schema and stored procedures to Spark SQL notebooks or Warehouse objects.
- Migrates Spark items, including notebooks and Spark Job Definitions, to Fabric equivalents.
- Maps Linked Services to Fabric Data Connections or OneLake Shortcuts.
- Manages the migration of approved dependent pipeline callers.
- Validates persisted definitions and artifacts against established contracts.
When to use it
- When migrating a full Synapse workspace to Microsoft Fabric.
- When converting Dedicated SQL Pool schema and procedures to a Lakehouse or Warehouse.
- When porting Spark pools, notebooks, or Spark Job Definitions to Fabric.
- When replacing Synapse Linked Services with Fabric-native connectivity.
Advantages
- Ensures dependency-ordered migration to maintain system integrity.
- Provides clear routing for different workload types (Lakehouse vs. Warehouse).
- Enforces strict validation and approval gates for behavior-changing decisions.
- Supports incremental migration rather than high-risk big-bang cutovers.
- Standardizes the conversion of T-SQL procedures to executable Spark SQL notebooks.
Usage examples
- “Migrate this Dedicated SQL Pool DACPAC to a Fabric Lakehouse and convert the procedures.”
- The agent will assess gaps, obtain approval for procedure-to-notebook mappings, create a migration manifest, convert schema/code artifacts, and validate the results.
- “Migrate this Dedicated SQL Pool to Fabric Warehouse.”
- The agent will assess DDL compatibility, remove unsupported distribution/index declarations, obtain provisioning consent, and prepare for potential data migration.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/microsoft/synapse-migration/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip synapse-migration.zip -d .agents/skills
Documentation by Microsoft
Telemetry — MANDATORY. Every
api.fabric.microsoft.comcall must carryx-ms-fabric-skill: synapse-migration(az rest:--headers "x-ms-fabric-skill=synapse-migration"), including every LRO poll,fabric_lroand retry. Snippets omit it — add it anyway.
OFFLINE LAKEHOUSE ARTIFACT FAST PATH — DECIDE FIRST. For a no-live-call request with complete supplied inputs and contracts, load only the fast path; do not load
migration-planning-reference.md,dedicated-pool-conversion.md, or implementation scripts. Use one generator for artifacts and final-byte hashes, then one verifier. Do not inspect generated files or run post-pass spot checks. For every optional non-null source default, setmissingValueBehaviortoUseSourceDefaultand restore that default before validation. Do not use this path for a Warehouse target; incomplete and large-procedure requests use their own routes.
CRITICAL NOTES
To find workspace details (including its ID) from a workspace name: list all workspaces, then use JMESPath filtering.
To find item details (including its ID) from workspace ID, item type, and item name: list all items of that type in that workspace, then use JMESPath filtering.
Treat a source Dedicated SQL Pool as read-only. Do not run source DDL, DML, stored procedures, or create sample objects.
Dedicated Pool-to-Lakehouse data movement is out of scope. Migrate schema and executable code artifacts only; do not copy source rows or run row-level/business-result equivalence queries. The separate Warehouse route may move data only from a separately approved restored export copy under its own consent gate and restored-source contract.
For Dedicated Pool-to-Lakehouse requests, complete gap assessment, explicit mapping approval, manifest creation, conversion, deployment, and validation in order. Read dedicated-pool-to-lakehouse.md once as the router, then load only the current phase reference.
Stored-procedure
1:1,N:1, andN:Nmappings never apply to views. Views remain schema objects; procedures become traceable Spark SQL notebooks with executable%%sqltransformation cells.Dependent ADF/Synapse callers are conditional scope, not automatic scope. Discover them during assessment, require a separate complete-closure approval, and migrate them only after notebook readiness. Route standalone pipeline requests to
pipeline-migration.Before executing a specialized Dedicated Pool workflow, read the matching contract in dedicated-pool-execution-contracts.md. Its validation, hashing, request-body, resume, and completion-language requirements are mandatory.
Keep Lakehouse and Warehouse paths separate. If the target is unclear, ask before loading path-specific resources. Lakehouse conversion never moves source rows; Warehouse data migration requires its own explicit consent gate and restored-source contract.
For a Fabric Warehouse target, explicitly state that the complete
DISTRIBUTIONandCLUSTERED COLUMNSTORE INDEXdeclarations are removed because Fabric manages distribution, storage, and indexing; a bare mention of either source clause is insufficient.Run setup DDL and CETAS only against the separately approved restored export copy after proving it is not the original production source.
Synapse Analytics to Microsoft Fabric Migration
Core Workflow
Discover the Synapse workspace and classify every source artifact.
Choose targets using workload-routing.md.
Assess gaps before conversion, including runtime, library, connectivity, T-SQL, security, and capacity constraints.
Obtain approval for behavior-changing decisions, target placement, and every stored-procedure-to-notebook mapping.
Create or update
migration-manifest.jsonand persist approval, per-object status, hashes, and checkpoints atomically.Convert and deploy in dependency order, loading only the current phase resource.
Validate persisted definitions and artifacts without executing generated notebooks or pipelines unless a separately approved workflow explicitly requires execution.
Report completed, blocked, skipped, and pending objects without exposing credentials or sensitive values.
For full-workspace orchestration, read migration-orchestrator.md. For a Dedicated Pool-to-Lakehouse migration, use dedicated-pool-to-lakehouse.md as the phase router. For a Warehouse target, load only the matching dw-* resource.
Scope Routing
| Request | Action | Load |
|---|---|---|
| Full Synapse workspace migration | Run phased discovery and migration | migration-orchestrator.md |
| Dedicated SQL Pool schema/code to Lakehouse | Run the strict assessment-to-validation workflow. For guidance-only notebook publication, explicitly state: "The stored procedures were converted from T-SQL to Spark SQL before publication." | dedicated-pool-to-lakehouse.md |
| Guidance-only Dedicated Pool incremental deployment hardening | Answer directly from the focused checklist; do not search scripts or load phase resources. State: "For columns with special characters, enable Delta columnMapping selectively and only with approval." | dedicated-pool-execution-contracts.md |
| Large or complex stored procedure | For a complete offline contract, read only the audit resource once, use one run-local generator and one verifier, do not inspect implementation scripts or generated outputs, and stop after successful verification | dedicated-pool-large-procedure-audit.md |
| Spark pool | Convert configuration and libraries to a Fabric Environment | spark-pool-migration.md |
| Lake Database or HMS | Create or bind the target Lakehouse | lake-database-migration.md or external-hms-migration.md |
| Notebook or Spark Job Definition | Port code, bindings, parameters, and runtime settings | spark-item-migration.md |
| Linked Service | Choose a Fabric Data Connection for external services or a OneLake Shortcut for ADLS Gen2/Blob | connectivity-migration.md |
| Approved dependent procedure callers | Run the internal closure-preserving sub-flow after notebook readback | dedicated-pool-dependent-pipelines.md |
| Standalone pipeline migration | Delegate | pipeline-migration |
| Dedicated SQL Pool to Fabric Warehouse | Run the source extraction, DDL compatibility, approval, optional data, security, and validation route | dw-source-and-extraction.md, then the matching dw-* phase resource |
| Standalone Fabric Warehouse administration | Delegate | sqldw-cli |
| Synapse Link | Use Fabric Mirroring; not covered here | — |
Always report the Lake Database/HMS phase. If none is discovered, mark it NotApplicable (none discovered) while retaining the required target Lakehouse binding.
Load References On Demand
Do not preload all files. Load only the references needed for the current phase:
| Need | Reference |
|---|---|
| Routing, phase order, API audiences, quick examples, troubleshooting, or post-migration handoff | workload-routing.md |
| Dedicated Pool execution variants and response contracts | dedicated-pool-execution-contracts.md |
| Dedicated Pool discovery | dedicated-pool-discovery.md |
| Gap assessment and mapping approval | dedicated-pool-gap-assessment.md |
| Procedure conversion and notebook shape | dedicated-pool-conversion.md |
| Schema/notebook deployment | dedicated-pool-deployment.md |
| Dedicated Pool validation | dedicated-pool-validation.md |
| Runtime/library compatibility | feature-parity.md and library-compatibility.md |
mssparkutils and connector refactoring | utility-api-mapping.md, connector-refactoring.md, and code-patterns.md |
| Capacity planning | capacity-sizing.md |
| Dedicated Pool-to-Warehouse source discovery and extraction | dw-source-and-extraction.md |
| Warehouse DDL compatibility and deployment | dw-ddl-compatibility.md |
| Separately approved Warehouse data migration | dw-data-migration.md |
| Warehouse security and validation | dw-security-validation.md |
| Validation, reporting, and production readiness | validation-testing.md, migration-report.md, and security-governance.md |
Use COMMON-CLI.md only for shared authentication and az rest mechanics not already covered by the phase resource. Use COMMON-CORE.md only for shared Fabric REST patterns.
Must
Preserve every stored-procedure input contract, source default, source decision, and approved target mapping.
Block conversion until gap dispositions, notebook names, dependency grouping, and target workspace placement are explicitly approved.
Use SqlPackage/DMVs for source discovery, Fabric REST for item management, and Fabric Livy statements for Lakehouse schema and Delta execution.
Run the maintained validators required by the selected execution contract; never replace them with ad hoc JSON or cell-shape checks.
Choose the Lakehouse or Warehouse target before loading implementation resources; never apply Warehouse data-movement rules to Lakehouse artifact conversion.
Before persisting any dependent-pipeline source definition, recursively inspect it for secret-bearing or uncertain properties; block the complete selected closure without writing the artifact or mutating a target when any are found.
In every dependent-pipeline response, including guidance-only and pre-approval explanations, state: "Use a
TridentNotebookactivity with exact target identitiestypeProperties.notebookIdandtypeProperties.workspaceId, and pass inputs throughtypeProperties.notebookParameters." Then state: "After deployment, read back each pipeline withPOST /v1/workspaces/{workspaceId}/items/{dataPipelineId}/getDefinitionand validate its canonical hash and structural bindings."For every Linked Service response, first state both replacement classes: Fabric Data Connections for external databases/services and OneLake Shortcuts for ADLS Gen2/Blob storage; then identify which class applies.
Replace
mssparkutilswithnotebookutils, Linked Services with the correct Fabric connection class, andspark.read.synapsesql()with a supported OneLake or JDBC pattern.Externalize workspace and item IDs through parameters or Variable Libraries.
Keep phase status concise, emit bounded heartbeats for long operations, and persist per-object evidence in the manifest.
Prefer
OneLake Shortcuts over copying data.
Fabric Environments for reproducible libraries and Spark settings.
Incremental, dependency-ordered migration over big-bang cutover.
Parameterized notebooks and Variable Libraries for environment promotion.
Lakehouse SQL Endpoint for compatible Serverless SQL Pool read workloads.
Avoid
Do not execute generated notebooks or pipelines as part of artifact migration.
Do not broaden a selected dependent-pipeline closure or route that internal sub-flow to
pipeline-migration.Do not use
sqlcmdagainst the target Fabric Warehouse; use the registered SQL endpoint tooling required by the Warehouse resource.Do not preserve Synapse distribution/storage hints, PolyBase DDL, Linked Service connection strings, or pool-level library installation patterns verbatim.
Do not use target notebooks to orchestrate the migration itself.
Do not hardcode workspace IDs, item IDs, credentials, connection strings, or environment-specific paths.
Examples
Prompt: "Migrate this Dedicated SQL Pool DACPAC to a Fabric Lakehouse and convert the procedures."
Response behavior: Assess gaps first, present and obtain approval for the complete procedure-to-notebook mapping and workspace placement, create the manifest, convert approved schema/code artifacts without moving source rows, validate persisted definitions, and report the resolved Lakehouse and artifact evidence.
Prompt: "Migrate this ADF pipeline to Fabric."
Response behavior: Route to pipeline-migration. Keep it here only when the pipeline is an explicitly approved dependent caller discovered inside an active Dedicated Pool-to-Lakehouse migration.
Prompt: "Migrate this Dedicated SQL Pool to Fabric Warehouse."
Response behavior: Keep this inside synapse-migration, assess DDL compatibility, remove unsupported distribution and columnstore declarations, obtain provisioning consent, and ask separately before any restored-source data migration.
For code transformations and edge cases, load workload-routing.md and the phase-specific resource rather than expanding the main instructions.
Files
- ATTRIBUTION.mdAdded by AutoGineer879 B
- LICENSELicence file added by AutoGineer1.1 KiB
- SKILL.md14.3 KiB
- apm.yml597 B
- references/dedicated-pool-execution-contracts.md14.5 KiB
- references/workload-routing.md6.0 KiB
- resources/capacity-sizing.md4.1 KiB
- resources/code-patterns.md8.4 KiB
- resources/connectivity-migration.md6.4 KiB
- resources/connector-refactoring.md13.8 KiB
- resources/dedicated-pool-conversion.md39.2 KiB
- resources/dedicated-pool-dependent-pipelines.md23.3 KiB
- resources/dedicated-pool-deployment.md20.0 KiB
- resources/dedicated-pool-discovery.md17.8 KiB
- resources/dedicated-pool-gap-assessment.md17.4 KiB
- resources/dedicated-pool-large-procedure-audit.md24.5 KiB
- resources/dedicated-pool-to-lakehouse.md17.9 KiB
- resources/dedicated-pool-validation.md17.2 KiB
- resources/dw-data-migration.md13.7 KiB
- resources/dw-ddl-compatibility.md9.4 KiB
- resources/dw-security-validation.md15.6 KiB
- resources/dw-source-and-extraction.md8.0 KiB
- resources/external-hms-migration.md20.2 KiB
- resources/feature-parity.md5.4 KiB
- resources/lake-database-migration.md34.8 KiB
- resources/library-compatibility.md7.2 KiB
- resources/migration-gotchas.md16.1 KiB
- resources/migration-orchestrator.md63.0 KiB
- resources/migration-planning-reference.md16.3 KiB
- resources/migration-report.md16.9 KiB
- resources/security-governance.md47.4 KiB
- resources/spark-item-migration.md19.2 KiB
- resources/spark-pool-migration.md16.3 KiB
- resources/utility-api-mapping.md5.4 KiB
- resources/validation-testing.md14.5 KiB
- scripts/Invoke-DedicatedPoolTool.ps1Script941 B
- scripts/dedicated-pool-tool/DedicatedPoolMessageSanitizer.csScript2.1 KiB
- scripts/dedicated-pool-tool/DedicatedPoolTool.csproj346 B
- scripts/dedicated-pool-tool/Program.csScript31.4 KiB
- scripts/dedicated_pool_runtime.pyScript116.9 KiB
- scripts/validate_dedicated_pool_spark.pyScript24.8 KiB
resources/migration-gotchas.md
Migration Troubleshooting Guide
Common migration failures, edge cases, and resolution steps. Items are flagged during migration and surfaced in the migration report with links back to the relevant section here.
Philosophy: The legacy notebook and Spark job definition issues in this guide do not block artifact copying; affected items are copied as-is, failures are logged, and this guide is linked from the report for post-migration remediation. This does not override fail-closed conversion gates in other migration paths. In particular, Dedicated SQL Pool objects classified as
ManualReviewRequiredare not converted or deployed until the required decision or approval is recorded.
G1: spark.read.synapsesql() — No Direct Fabric Equivalent
Flag ID: SYNAPSESQL_NO_EQUIVALENT
When it fires: Code audit detects synapsesql pattern in a notebook or SJD.
Symptom: After migration, running the notebook fails with:
AnalysisException: Failed to find data source: synapsesqlRoot cause: The spark.read.synapsesql() connector reads from Synapse Dedicated SQL Pools. This connector does not exist in Fabric.
Resolution Options
| Option | When to Use | Steps |
|---|---|---|
| A: Lakehouse shortcut | Data is in ADLS Gen2 behind the Dedicated SQL Pool (external tables) | Create a OneLake shortcut to the source storage → read as Delta/Parquet. See connectivity-migration.md |
| B: Fabric Warehouse JDBC | Data must come from a SQL endpoint (Dedicated Pool or Fabric Warehouse) | Replace with JDBC read using notebookutils.credentials.getToken() for auth |
| C: Data pipeline | The notebook was doing bulk reads from SQL that should be a pipeline activity | Create a Fabric Data Pipeline with a Copy activity instead |
Code Example — Option B (JDBC)
# ❌ BEFORE — Synapse
df = spark.read.synapsesql("mypool.dbo.FactSales")
# ✅ AFTER — Fabric (JDBC to SQL endpoint)
jdbc_url = "jdbc:sqlserver://myserver.sql.azuresynapse.net:1433;database=mypool"
token = notebookutils.credentials.getToken("https://database.windows.net/")
df = (spark.read
.format("jdbc")
.option("url", jdbc_url)
.option("dbtable", "dbo.FactSales")
.option("accessToken", token)
.option("encrypt", "true")
.option("hostNameInCertificate", "*.sql.azuresynapse.net")
.load())See also: connector-refactoring.md § spark.read.synapsesql() for the full before/after pattern.
G2: Custom Library Version Conflicts with Fabric Runtime
Flag ID: LIBRARY_VERSION_CONFLICT
When it fires: Environment publish fails, or a notebook import fails with version resolution errors. Also flagged when Synapse pool libraries specify versions incompatible with Fabric Runtime 1.3 built-ins.
Symptom: After Environment publish or notebook execution:
ResolvePackageNotFound: ... conflicts with runtime built-in versionor
ImportError: cannot import name 'X' from 'Y' (wrong version installed)Root cause: Synapse Spark pools may pin library versions (e.g., pandas==1.4.3) that conflict with Fabric Runtime 1.3 built-in versions (e.g., pandas==2.1.1). Fabric does not allow downgrading built-in libraries.
Resolution Steps
Identify conflicts — compare
libraryRequirements.contentfrom the Synapse pool against Fabric Runtime 1.3 built-in versions:# In a Fabric notebook, list built-in versions: import pkg_resources for pkg in sorted(pkg_resources.working_set, key=lambda p: p.key): print(f"{pkg.key}=={pkg.version}")Remove pins for built-in libraries — if the Synapse requirements.txt pins a version that Fabric already provides at a newer version, remove the pin:
# Synapse requirements.txt: pandas==1.4.3 ← REMOVE (Fabric has 2.1.1) scikit-learn==1.2.0 ← REMOVE (Fabric has 1.3.2) my-custom-lib==1.0.0 ← KEEP (not a built-in)Test for breaking API changes — if the version jump is major (e.g., pandas 1.x → 2.x), code may break. Common issues:
pandas.DataFrame.append()removed in pandas 2.x → usepd.concat()sklearn.externals.joblibremoved → useimport joblibdirectlynumpydtype changes (e.g.,np.int→np.int64)
If a specific older version is required — use
%pip installin the notebook as a last resort:%pip install pandas==1.4.3 --force-reinstallThis overrides the built-in version for the session only. Not recommended for production — may cause instability with other built-in libraries that depend on the newer version.
See also: library-compatibility.md for a complete list of Synapse-vs-Fabric library gaps.
G3: Delta Lake Protocol Version Incompatibility
Flag ID: DELTA_PROTOCOL_MISMATCH
When it fires: A Lakehouse shortcut points to Delta tables written by Synapse using a newer or incompatible Delta protocol version.
Symptom: Reading the shortcutted table fails with:
DeltaErrors: The table has reader version X, which is not supported by this version of Delta Lakeor
Unsupported reader/writer feature: deletionVectors / columnMapping / v2CheckpointsRoot cause: Synapse Spark pools may write Delta tables using protocol features that the selected Fabric Runtime or downstream reader does not support, or the target DDL may contain logical column names that require Delta column mapping.
Resolution Steps
Check the protocol version of the source Delta table:
# In a Synapse notebook (before migration): from delta.tables import DeltaTable dt = DeltaTable.forPath(spark, "abfss://[email protected]/path/to/table") detail = dt.detail().select("minReaderVersion", "minWriterVersion").collect()[0] print(f"Reader: {detail.minReaderVersion}, Writer: {detail.minWriterVersion}")Check the selected Fabric Runtime and every downstream reader against current Microsoft documentation. Do not use a hardcoded runtime/version matrix.
Keep the source read-only. If the source shortcut protocol is unsupported, record
ManualReviewRequired; do not rewrite, drop, rename, or downgrade the source table as part of this migration.Plan new target DDL selectively with
plan_delta_column_mapping:safe logical names: normal Delta DDL;
restricted names such as spaces, commas, semicolons, braces, parentheses, newlines, tabs, or equals signs: require downstream compatibility approval, then emit
TBLPROPERTIES ('delta.columnMapping.mode' = 'name');existing compatible target or shortcut: validate and reuse it without protocol changes;
existing incompatible or uncertain target: block for manual review rather than altering it.
Record protocol and mapping evidence in
expected-schema.jsonandmigration-manifest.json, including offending logical names, current mode, decision, and approval.
Pre-migration check: Inventory Delta protocol features and column mapping for every existing target or shortcut, and validate downstream compatibility before any target mutation.
G4: Synapse Security Model — Managed Identities & IP Firewall
Flag ID: SECURITY_MODEL_INCOMPATIBLE
When it fires: The Synapse workspace uses security features that don't have direct Fabric equivalents.
G4a: Managed Identity Differences
Symptom: After migration, notebooks fail with 403 Forbidden when accessing external resources (ADLS, Key Vault, SQL).
| Synapse Feature | Fabric Equivalent | Migration Action |
|---|---|---|
| Workspace Managed Identity (system-assigned) | Fabric Workspace Identity | Enable Workspace Identity in Fabric Settings → grant same RBAC roles on external resources |
| User-assigned Managed Identity | Not supported | Switch to Fabric Workspace Identity or service principal stored in Key Vault |
LinkedServiceBasedTokenProvider | Not available | Replace with ClientCredsTokenProvider + Key Vault. See connector-refactoring.md |
Steps:
Enable Fabric Workspace Identity: Workspace Settings → Identity → Enable
Grant the workspace identity the same roles the Synapse MSI had:
Storage Blob Data Reader/Contributor on ADLS Gen2 accounts
Key Vault Secrets User on Key Vault instances
SQL db_datareader on SQL databases (via Entra ID admin)
Update notebook code that used
mssparkutils.credentials.getToken()— this works in Fabric withnotebookutils.credentials.getToken(), but the identity backing it is now the Fabric workspace identity, not the Synapse MSI
G4b: IP Firewall Rules
Symptom: Synapse workspace had IP-based access control. Fabric does not support IP firewall rules at the workspace level.
| Synapse Feature | Fabric Alternative |
|---|---|
| Synapse IP firewall rules | Entra ID Conditional Access with named locations |
| Managed Virtual Network | Fabric Managed Private Endpoints (requires Custom Pool in Environment) |
| Data Exfiltration Protection | Fabric tenant-level settings + Conditional Access |
Steps:
Document existing IP rules from the Synapse workspace: Portal → Synapse workspace → Firewalls
Create Entra Conditional Access policy: Entra ID → Security → Conditional Access → New policy
Target: Microsoft Fabric (app ID)
Condition: Named locations (replicate the IP ranges from Synapse firewall)
Grant: Allow access only from named locations
For private connectivity: Set up Managed Private Endpoints in a Fabric Environment with Custom Pool. See security-governance.md § S6
See also: security-governance.md for the full security migration guide.
G5: GPU Pool Migration Blocker
Flag ID: GPU_POOL_UNSUPPORTED
When it fires: Synapse Spark pool has nodeSizeFamily == "HardwareAcceleratedGPU".
Symptom: No Fabric equivalent — GPU-accelerated Spark is not available in Fabric.
Resolution Options
| Option | Steps |
|---|---|
| Keep on Synapse | Continue running GPU workloads on Synapse until Fabric adds GPU support |
| Refactor to CPU | Replace GPU-accelerated ML training with CPU-based alternatives (e.g., LightGBM, scikit-learn) |
| Use Azure ML | Move GPU training to Azure ML compute clusters and call from Fabric via REST API |
G6: .NET for Spark (C#/F#) SJD Blocker
Flag ID: DOTNET_SPARK_UNSUPPORTED
When it fires: SJD has language == "dotnet" or language == "csharp".
Symptom: Fabric does not support .NET for Apache Spark.
Resolution
Rewrite the SJD in Python or Scala. Common patterns:
| C# Pattern | Python Equivalent |
|---|---|
spark.Sql("SELECT ...") | spark.sql("SELECT ...") |
spark.Read().Parquet("...") | spark.read.parquet("...") |
dataFrame.Filter(col => ...) | df.filter(F.col(...)) |
.WithColumn("x", Functions.Lit(1)) | .withColumn("x", F.lit(1)) |
G7: bigDataPool / targetBigDataPool Field is null (Not Missing)
Flag ID: NULLABLE_POOL_REFERENCE
When it fires: Code reads properties.bigDataPool.referenceName (notebooks) or properties.targetBigDataPool.referenceName (SJDs) and crashes with AttributeError: 'NoneType' object has no attribute 'get'.
Root cause: The Synapse API returns "bigDataPool": null (field present with value null) when no pool is assigned — instead of omitting the field entirely. The common pattern .get("bigDataPool", {}).get("referenceName") fails because dict.get() returns None (the actual value), not {} (the default).
Resolution
Use the or {} defensive pattern:
# ❌ WRONG — crashes when bigDataPool is null
pool_name = nb.get("bigDataPool", {}).get("referenceName", "")
# ✅ CORRECT — handles null, missing, and present cases
pool_name = (nb.get("bigDataPool") or {}).get("referenceName", "")Same pattern applies to SJDs:
pool_name = (sjd.get("targetBigDataPool") or {}).get("referenceName", "")G8: Notebook Session Configuration (%%configure)
Flag ID: SESSION_CONFIG_IGNORED
When it fires: Notebook contains %%configure magic with Synapse-specific driver/executor settings.
Symptom: %%configure is supported in Fabric but some Synapse-specific keys are silently ignored.
Synapse-Specific Keys to Remove
// ❌ These keys are Synapse-specific — remove from %%configure:
{
"conf": {
"spark.synapse.pool.name": "MyPool", // → remove
"spark.storage.synapse.linkedServiceName": "", // → remove
"spark.synapse.workspace.name": "" // → remove
},
"driverMemory": "28g", // ✅ kept — works in Fabric
"executorMemory": "28g", // ✅ kept — works in Fabric
"numExecutors": 4 // ✅ kept — works in Fabric
}G9: Shortcut Creation Failures (ADLS Connection Issues)
Flag ID: SHORTCUT_CONNECTION_FAILED
When it fires: Phase 1 shortcut creation fails with 403, 400 (credential), or connection reset errors.
Symptom: Lakehouse is created but shortcuts are missing — tables are not accessible. The migration script aborts remaining shortcuts after the first fatal error.
Common Causes
| Error | Root Cause |
|---|---|
| 403 on shortcut creation | Connection's identity lacks Storage Blob Data Reader RBAC on the ADLS Gen2 storage account |
400 "Stored Credential" | Connection's OAuth token has expired, been revoked, or the user password was rotated |
ConnectionError / connection reset | Network connectivity issue or Fabric API transient outage |
Resolution
403 (permission):
Identify the connection's identity (Service Principal or user) from the Fabric Portal → Manage connections
Grant
Storage Blob Data Readeron the storage account (or container) via Azure Portal → IAMRe-run the migration — it will resume from where it left off (existing shortcuts return 409)
400 Stored Credential:
Open Fabric Portal → Settings → Manage connections and gateways
Find the ADLS connection → Edit → Re-authenticate with valid credentials
Alternatively, create a new connection and delete the stale one
Re-run the migration
Connection reset:
Retry after a few minutes — this is typically transient
If persistent, check VNet/private endpoint configuration between Fabric and the storage account
Note: The migration script uses an early-abort pattern for these errors — it stops creating shortcuts after the first fatal error because all subsequent shortcuts to the same storage account will fail for the same reason. See lake-database-migration.md § Shortcut Creation Error Cascade for the implementation pattern.
Flag ID Summary — Quick Reference
Use these IDs in the migration report to link to the corresponding section:
| Flag ID | Section | Severity | Blocks Execution? |
|---|---|---|---|
SYNAPSESQL_NO_EQUIVALENT | G1 | High | Yes — runtime error |
LIBRARY_VERSION_CONFLICT | G2 | Medium | Maybe — depends on conflict |
DELTA_PROTOCOL_MISMATCH | G3 | High | Yes — cannot read table |
SECURITY_MODEL_INCOMPATIBLE | G4 | Medium | Yes — 403 errors at runtime |
GPU_POOL_UNSUPPORTED | G5 | High | Yes — migration blocker |
DOTNET_SPARK_UNSUPPORTED | G6 | High | Yes — migration blocker |
NULLABLE_POOL_REFERENCE | G7 | Low | No — null handled safely |
SESSION_CONFIG_IGNORED | G8 | Low | No — silently ignored |
SHORTCUT_CONNECTION_FAILED | G9 | High | Partial — Lakehouse exists but tables missing |
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python
Security
What our scanner noticed· Low risk
- Instructions that use the network
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Microsoft
- Publisher
- Microsoft (Official)
- Source
- microsoft/skills-for-fabric · skills/synapse-migration · commit f8fac11
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
- Also distributed in
- microsoft/skills-for-fabric
AutoGineer is not affiliated with or endorsed by Microsoft.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download synapse-migration.zip