SQL Server sources use SQL Server's own change data capture. Fabric enables CDC, then polls each table's change table and maps the change rows to inserts, updates, and deletes. There is no replication slot and no subscription — SQL Server's capture job does the work.
Supported deployments
The same connector serves self-hosted SQL Server, Amazon RDS for SQL Server, and Azure SQL Managed Instance. CDC is enabled per database and per table the same way on each.
Prerequisites
SQL Server Agent
CDC's capture and cleanup jobs run under the SQL Server Agent. If the Agent is not running, the change tables never fill and the poller sees nothing. Confirm the service is started on the instance.
Enable CDC on the database
Run as an administrator (a login with db_owner on the database or sysadmin):
USE mydb;
GO
EXEC sys.sp_cdc_enable_db;
GOEnable CDC on each table you select
USE mydb;
GO
EXEC sys.sp_cdc_enable_table
@source_schema = N'dbo',
@source_name = N'customers',
@role_name = NULL,
@supports_net_changes = 1;
GOA selected table with no capture instance is refused by name. Enable CDC after seeding a table if you want the Fabric snapshot to own the existing rows.
Retention must outlast your outage window
Fabric refuses a cleanup retention shorter than 72 hours (its default requirement). Raise it on the server:
EXEC sys.sp_cdc_change_job @job_type = N'cleanup', @retention = 10080; -- minutes
GOIf the window is exceeded, change-table rows are purged and a resume silently restarts from the top rather than erroring — size the window for your worst-case downtime.
A least-privilege login
Fabric needs SELECT on the cdc schema (for change-table polls) and SELECT on the base tables (for the snapshot and schema discovery):
USE mydb;
CREATE USER fabric_cdc FOR LOGIN fabric_cdc;
GRANT SELECT ON SCHEMA::cdc TO fabric_cdc;
GRANT SELECT ON SCHEMA::dbo TO fabric_cdc;
GOEnabling CDC itself needs sysadmin or db_owner and is a one-time setup step, separate from the login Fabric runs as.
Network and driver
The runner reaches host:1433. Fabric ships the ODBC Driver 18 for SQL Server and, on the engine default and require, sets TrustServerCertificate=yes in the connection string — the connection is encrypted but the certificate is not verified. A verify-full source turns that off and verifies the chain and host name instead; see TLS and encryption in transit.
Connection fields
| Field | Required | Default | Notes |
|---|---|---|---|
| Connector name | Yes | — | Unique across sources. |
| Host | Yes | — | |
| Port | Yes | 1433 | |
| Username | Yes | — | Login used for polling and snapshot. |
| Password | Yes on create | — | Leave blank on edit to keep the stored password. |
| Database | Yes | — | A single database. Test connection lists online user databases. Read-only after creation. |
One database per source
How it replicates
- Fabric polls each table's change table
cdc.<schema>_<table>_CTwith an LSN bookmark, ordered by__$start_lsn. - Update pairs emitted by CDC (
__$operation3 and 4) are collapsed into a single update; CDC's own metadata columns are stripped before landing. - The snapshot captures
sys.fn_cdc_get_max_lsn()before scanning and checkpoints per-table progress, so a mid-snapshot crash resumes under the same mark. - Snapshot chunking uses a single-column unique clustered index or an identity column; a table with no safe key falls back to one unchunked pass.
Gotchas
Watch out
- Per-table capture instances are checked when the runner starts, not at source creation — at creation no tables are selected yet.
- The classic silent failure is a stopped SQL Server Agent: the change tables stay empty and the poller sees no rows.
- A login failure is treated as a held state, not a crash loop — the source shows
heldwith the refusal reason. - Non-
dboschemas are supported: the change table is namedcdc.<schema>_<table>_CT.