Skip to content

What an Enterprise iPaaS Must Get Right on SQL Server

A buyer's guide to putting an integration layer in front of SQL Server. It covers why SSIS is an ETL engine and not an iPaaS, how to read changes without losing them across CDC, Change Tracking and rowversion, what a safe write path into a live database looks like, how Azure SQL Database and Managed Instance change the answer, and the security questions a reviewer will ask.

Author
Ruben Burdin · Founder & CEO
Published
July 23, 2026
Read time
11 min read
What an Enterprise iPaaS Must Get Right on SQL Server
DATA ENGINEERING

SQL Server holds the ledger for a large share of mid-market and enterprise operations: order lines, contracts, inventory, entitlements, claims. The systems that grew up around it, the CRM the sales team works in, the ERP finance closes in, the warehouse the analysts query, all need those rows while they are still current.

Teams get stuck here, and not for lack of options. SQL Server ships with more built-in ways to move data than any other database: SSIS packages, replication, linked servers, change data capture, Change Tracking, the ODBC and OLE DB drivers. Every one was designed to move data around a Microsoft estate. None was designed to keep a table and a Salesforce object holding the same value in both directions.

Four facts that decide how you sync SQL Server: CDC retention defaults to three days, SSIS moves one way on a schedule, Azure SQL Database has no SQL Server Agent, and two-way sync resolves changes per field

This is what an enterprise iPaaS has to do when SQL Server is the system in the middle. Not integration platforms in general: SQL Server specifically, its change-capture surface, its write path, its collation, and the gap between a box in your rack and an Azure SQL Database. If you already know the pair you need, go straight to SQL Server and Salesforce or two-way sync between SQL Server and NetSuite.

What does an enterprise iPaaS have to do on SQL Server?

It has to read committed changes out of the database within seconds and write changes from Salesforce, NetSuite, HubSpot, or Snowflake back into the same tables, with a stated policy for what happens when a value moves on both sides at once. You configure it rather than build it: the alternative is a folder of packages, Agent jobs, and stored procedures one person on your team owns forever.

The word enterprise is not decoration. Plenty of tools copy a table into a warehouse overnight. What separates a platform is the awkward cases: a column added to a hot table on a Tuesday, a SaaS API returning 429 on the last day of the month, a bulk update touching 300,000 rows, an availability group failover that moves the listener, and an auditor asking which system last wrote a value.

Three layers around SQL Server: the database with its deployment surfaces and change-capture features, the two-way sync engine, and the business systems that consume and produce the same records
The integration layer is a tier of its own, not a package bolted onto either end.

Drawn as a stack it is easier to argue about. At the bottom sits SQL Server with its deployment surface, its collation, and its change-capture features. At the top sit the business systems that consume and produce the same records. In the middle is a tier that speaks two languages: T-SQL and change tables on one side, REST and bulk APIs on the other. When that tier is a set of scripts, its failure modes become somebody's afternoon instead of a logged, retried event.

Is SSIS an iPaaS?

No, and it is worth saying plainly, because search results for SQL Server integration are almost entirely SSIS documentation. SQL Server Integration Services is an ETL engine, and a capable one. You build a .dtsx package, deploy it to the SSISDB catalog, and a SQL Server Agent job runs it on a schedule. It is batch shaped by design: extract a set, transform it, load it somewhere. No change stream, no write-back contract, no conflict resolution, because none of those was ever in scope.

That gap shows up the moment the data leaves the Microsoft estate. Reaching Salesforce or NetSuite from SSIS means a Script Task, a paid adapter, or a staging table plus something else, and then you own the pagination, the token refresh, the rate-limit backoff, and the retries. On Azure SQL Database there is no SQL Server Agent at all, so the scheduling model the design rests on is gone: the packages move into the Azure-SSIS integration runtime inside Data Factory.

The other in-house options have the same shape. Transactional replication is fast and dependable, and it moves rows between SQL Server endpoints, not into a SaaS object model. Merge replication resolves conflicts through article-level resolvers, not per field against a CRM. Linked servers with sp_addlinkedserver, OPENQUERY, and an MSDTC distributed transaction reach another database well enough, and turn brittle the moment the other side is an HTTP API with an expiring token.

SSIS packagesReplication and linked serversGeneric ETL or reverse ETLStacksync
DirectionOne way, source to destinationOne way, SQL Server to SQL ServerOne way per pipelineBoth ways on one connection
LatencyWhatever the Agent schedule saysSeconds, inside the Microsoft estateMinutes to hours per runSeconds, on commit
Conflict handlingNone, the last package winsMerge replication resolves per articleNone, the target is overwrittenPer field, by policy
Reaches SaaS APIsScript Tasks or paid adaptersNot what it was built forYes, read-only in most casesYes, read and write
Runs on Azure SQL DatabaseNeeds Azure-SSIS IR in Data FactoryCan subscribe, cannot publishYesYes
Who maintains itYour team, in .dtsx and Agent jobsYour DBAYour data team plus the vendorHosted and monitored for you

SSIS is not a worse iPaaS. It is a different tool that was never asked to do this job.

The last row decides most evaluations: every option except the platform leaves running software with your team's name on it.

How do you read changes out of SQL Server without losing them?

SQL Server gives you three real read paths, and they are not interchangeable. Change data capture reads the transaction log and stores the full before-and-after row. Change Tracking records that a row changed and which columns changed, but not the old values. A rowversion column gives you a monotonic high-water mark you can poll. Which one a platform uses decides how much you can trust the result.

CDC is the richest of the three. sys.sp_cdc_enable_db and then sys.sp_cdc_enable_table create cdc.<schema>_<table>_CT change tables plus a capture job and a cleanup job that SQL Server Agent runs. The trap is retention. The default is 4,320 minutes, three days, and the cleanup job deletes anything older without asking whether a consumer read it. A sync that pauses over a long weekend does not resume, it gaps. Anything reading CDC has to advance its position continuously and alarm when it cannot.

Change Tracking is the lighter alternative: ALTER DATABASE … SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON), then read with CHANGETABLE(CHANGES …) against a version from CHANGE_TRACKING_CURRENT_VERSION(). It costs far less on the instance and has the same retention cliff. Because it does not keep old values, an engine using it re-reads the current row: usually fine, occasionally not, since a value that changed twice between reads collapses into one.

Polling a modified timestamp is the fallback everybody writes first, and the one that quietly loses rows. WHERE modified_at > @last assumes commit order matches timestamp order. It does not: a transaction that stamped its row before your last read and committed after it carries an older value, so it never appears again. A rowversion column fixes the ordering, because the value comes from a database-wide counter assigned at write time, but it says nothing about deletes. The line between capturing changes and reconciling state is drawn in bi-directional sync versus CDC.

Topology: a SQL Server instance emitting change rows through CDC change tables or Change Tracking into the Stacksync engine, which writes to Salesforce, NetSuite, HubSpot, and Snowflake and merges changes back into the same tables
One engine in front of the instance, not one pipeline per destination.

The topology matters as much as the mechanism. SQL Server should emit its changes once. The engine fans them out and accepts changes coming back on the same connection. Adding Snowflake six months later should not disturb the Salesforce sync you already trust.

How do you write back into SQL Server safely?

Reading is the easy half. Writing into a live operational database is where an integration either behaves or starts an incident, and four specifics decide which.

  • MERGE needs a lock hint. The upsert everyone reaches for is a MERGE on a business key, and under concurrent writers it is not safe without WITH (HOLDLOCK) on the target. Without it you get primary key violations and duplicate rows under load, intermittently.
  • Identity columns are not external IDs. An IDENTITY value is local to the table; a Salesforce record ID or a NetSuite internal ID is the key the other system knows. A sync needs a dedicated mapping column with its own unique index, not an assumption that row 4213 is the same customer on both sides.
  • Collation can merge two records into one. The common default, SQL_Latin1_General_CP1_CI_AS, is case insensitive. SaaS external IDs are frequently case sensitive, so a1B2c and A1b2C match as the same key on lookup and two upstream records become one row. Store that key in a case-sensitive collation or normalise it on the way in, but decide it deliberately.
  • Isolation and deadlocks. A bulk upsert that holds locks on a hot table will deadlock against the application. READ_COMMITTED_SNAPSHOT moves readers onto the tempdb version store, which keeps queries off the writers' locks and adds pressure on tempdb. Whatever writes into the database should batch, keep transactions short, and retry the deadlock victim rather than fail the run.

A fifth item is organisational more than technical: constraints mean something. A production table has check constraints, foreign keys, NOT NULL columns, and triggers that encode rules nobody wrote down elsewhere. A platform writing into it has to surface a violation as a per-record error you can see and fix, not swallow it and not abort the batch. Ask to watch that on real data before you sign anything.

Does it work on Azure SQL Database, Managed Instance, and VMs?

This question changes the answer to every other question, and most evaluations skip it. SQL Server is four deployment surfaces wearing one name, and each removes something an integration tool may have relied on.

  • SQL Server on Windows or Linux, on your own hardware. Everything is available: Agent, CDC, Change Tracking, replication, CLR, linked servers. The constraint is the network, not the feature set.
  • SQL Server on a cloud VM. The same engine and features, with the same administration you thought you were escaping. Worth naming, because vendors sometimes count it as "we support Azure" when Azure SQL Database is a different story.
  • Azure SQL Managed Instance. Close to the full engine, with SQL Server Agent, CDC, and cross-database queries. Some surface is still trimmed, and it lives inside a VNet subnet, which shapes how anything external connects.
  • Azure SQL Database. A single database, no SQL Server Agent, no msdb, no cross-database queries. CDC does work here, on S3 or higher in the DTU model and on any tier in the vCore model, but a built-in scheduler runs the capture and cleanup rather than Agent. Anything you scheduled through Agent has to be rebuilt.

The practical test is short. Ask which of those four a vendor runs in production today, and what changes in the setup between them. "SQL Server is supported" without that breakdown means it was tested on one of them, and you find out which during the migration.

Book a Stacksync demo: real-time two-way sync between SQL Server and your CRM, ERP, and warehouse

How does an iPaaS reach a SQL Server instance securely?

Most production SQL Server instances are not on the public internet, so the onboarding instructions are the security answer. If setup amounts to opening port 1433 and allowlisting an IP range, that is the answer and it is the wrong one. You want a private endpoint or VNet integration into the subnet where Managed Instance lives, or an outbound agent that dials out rather than accepting inbound connections.

Authentication is the second half. Microsoft Entra ID authentication replaces a long-lived SQL login with a token-based identity you can govern centrally, and it is what a reviewer will ask for on any Azure deployment. On transport, ODBC Driver 18 for SQL Server changed the default to Encrypt=yes and refuses a self-signed certificate unless you set TrustServerCertificate=yes. That default broke a lot of upgrades from Driver 17.

The third question does most of the work in a review: where does the data rest. A platform that copies your rows into its own store has added a system to the compliance scope you drew around the database and its network. Stacksync moves data between the connected systems without parking a copy in the middle, encrypted in transit, with every write in an audit log. On paperwork, Stacksync holds SOC 2 Type II and ISO 27001, offers a HIPAA BAA, and is GDPR-ready.

What to evaluate in a vendor, and where to start

Every vendor page claims real time and two way. These questions separate the ones that mean it, and each is answerable inside a trial rather than a sales call.

  • How does it read changes? CDC, Change Tracking, a polled rowversion, or a full table reload. Only the first three are incremental, and the reload stops being viable somewhere past a few million rows.
  • What happens when a sync pauses past retention? The honest answer includes an alert and a reseed path, not silence. Ask specifically about a destination system being down for a weekend.
  • Can it write back? Ask to watch an edit made in the CRM land in a SQL Server table, with the type mapping, the collation handling, and a rejected record visible while it happens.
  • What happens when a column is added? Adding a column to a synced table should not require rebuilding the sync, and dropping one should not stop it quietly.
  • Which deployment surfaces? On-prem, cloud VM, Managed Instance, Azure SQL Database, and exactly what changes between them.
  • How does it reach a private instance? Private endpoint, VNet integration, or an outbound agent. Not an allowlist on a public port.
  • What does the audit trail show? Which system wrote a value, when, and what it replaced. That is what a reviewer signs off on.

The way to test any of it is one pair, in production, for a week. Connect the system your team switches tabs to most, either Salesforce and SQL Server or NetSuite and SQL Server, and watch three things: whether a change on either side lands on the other in seconds, whether the change tables stay current instead of growing, and what the write path does with a record your constraints reject. If all three hold, the rest of the stack is the same work on the same engine. Three worked examples of two-way sync show what that looks like.

Stacksync connects SQL Server to more than 1,000 systems on a single engine, in real time and in both directions, without keeping a copy of your data. See the SQL Server connector, read the same argument applied to a managed AWS database in what an enterprise iPaaS has to get right on Amazon RDS, or book a demo and we will point it at your own instance on the call.

Put one integration layer in front of SQL Server, real-time and two-way, with no Agent job to babysit

FAQ

Frequently asked questions

Is SSIS an iPaaS?
No. SQL Server Integration Services is an ETL engine. You build a .dtsx package, deploy it to the SSISDB catalog, and a SQL Server Agent job runs it on a schedule. It moves a batch in one direction, it has no change stream, no write-back contract, and no conflict resolution, because none of those were in scope for it. An iPaaS is a hosted layer that keeps two systems holding the same record in both directions, in seconds, and takes the operational burden off your team. SSIS also does not run on Azure SQL Database on its own, since there is no SQL Server Agent there, so you need the Azure-SSIS integration runtime in Data Factory.
Can you sync SQL Server with Salesforce in real time?
Yes. SQL Server exposes committed changes through change data capture or Change Tracking, and Salesforce exposes both a REST API and a change-event stream, so a sync engine can follow both sides and apply each change to the other within seconds. The part that decides whether it works in production is not the read path but the write path: a stable external-ID mapping column, a MERGE that is safe under concurrency, and a per-field conflict policy so an edit made in Salesforce and an edit made in SQL Server in the same minute do not overwrite each other silently.
Does SQL Server CDC work on Azure SQL Database?
Yes, with one structural difference. Azure SQL Database supports change data capture, but there is no SQL Server Agent there, so a built-in scheduler runs the capture and cleanup work instead of Agent jobs. Microsoft also requires enough service tier: S3 or higher in the DTU purchasing model, and any tier in the vCore model. Enabling CDC raises transaction log use, so plan headroom. Anything in your current pipeline that was scheduled through SQL Server Agent has to be rebuilt when you move to Azure SQL Database.
What is the difference between CDC and Change Tracking in SQL Server?
Change data capture reads the transaction log and writes the full before-and-after row into change tables named cdc.<schema>_<table>_CT, so you can see what a value used to be. Change Tracking records only that a row changed and which columns changed, not the old values, and you read it with CHANGETABLE(CHANGES ...) against a version number from CHANGE_TRACKING_CURRENT_VERSION(). CDC is richer and heavier; Change Tracking is much cheaper and enough when the sync re-reads the current row anyway. Both have a retention window that deletes history on a timer, so both need a consumer that keeps up.
How long does SQL Server keep CDC data?
Three days by default. The cleanup job created by sys.sp_cdc_enable_db uses a retention of 4,320 minutes, and it deletes change rows older than that without checking whether anything read them. That is the failure everybody meets once: a sync pauses over a long weekend and does not resume, it gaps. You can raise retention with sys.sp_cdc_change_job, but the real requirement is that whatever reads the change tables advances its position continuously and raises an alert when it falls behind.
Why does a naive modified_at poll lose rows in SQL Server?
Because commit order and timestamp order are not the same thing. A query of the form WHERE modified_at > @last assumes every row written after your last read carries a later timestamp. A transaction that set its timestamp before your read but committed after it carries an older value, so it is invisible on the next pass and never appears again. A rowversion column fixes the ordering, since the value comes from a database-wide counter assigned at write time, but it still tells you nothing about deleted rows. That is why CDC or Change Tracking is the correct read path.
Is Stacksync SOC 2 compliant, and does it store my SQL Server data?
Stacksync holds SOC 2 Type II and ISO 27001, offers a HIPAA BAA, and is GDPR-ready. It does not keep a copy of your records parked in a middleman: data moves between the connected systems, encrypted in transit, and every write is recorded in an audit log. That matters for SQL Server specifically, because a platform that copies your tables into its own store adds a system to the compliance scope you already drew around the database and its network.

About the author

Ruben Burdin
Ruben Burdin
Founder & CEO

Ruben Burdin is the Founder and CEO of Stacksync, the first real-time and two-way sync for enterprise data at scale. Ruben is a Y Combinator alumni with a strong background in software engineering and business.

All posts by Ruben Burdin

About Stacksync

Stacksync powers real-time, two-way sync between CRMs, ERPs, and databases. Engineers sync data at scale and automate workflows, not dirty API plumbing.

Coworkers laughing in front of a laptop in a casual office setting

Your last integration took months.
Your next one takes a prompt.