Query-Based CDC
also called Polling CDC, Timestamp-Based CDC
Detecting changes by repeatedly querying for rows modified since the last run — simple, universally available, and lossy in specific ways.
SELECT * FROM orders WHERE updated_at > :last_run. No special privileges, no connector, works
against any database including ones where log access is impossible.
Its limitations are structural rather than incidental, and each has bitten someone:
Deletes are invisible. A deleted row does not appear in any query. Soft deletes are the usual workaround, which is a schema change to the source.
Intermediate states are lost. A row updated three times between polls is seen once, in its final state. For an audit trail or an event-driven system that cares about transitions, this is disqualifying.
It depends on a reliable updated_at, which requires every writer — including migrations, batch
jobs and manual corrections — to maintain it. One path that does not is a silent gap.
Boundary races. A transaction that commits with a timestamp inside a window already polled is missed permanently. Overlapping windows plus deduplication mitigate it.
It loads the source, in proportion to polling frequency, so freshness and source impact trade directly against each other.
Use it when log-based CDC is genuinely unavailable, and know which of the above you are accepting.