What Changed, When, and by Whom: Temporal Tables and CDC
The was about announcing change as it happens. This one is about the opposite direction in time: being able to answer, later, what a row used to look like, when it changed, and ideally who…
The Transactional Outbox: Reliable Messaging Without Distributed Transactions
The made retries safe: when the same message arrives twice, the database refuses to act on it twice. That solves the consuming end. This post is about the producing end, and a problem that sounds…
Idempotency Is a Contract: Making Retries Safe from the Database Side
The closed out the first half of this series, the part of the contract you can see: column names, types, result-set shapes, the behavior of a single call. The rest of the series is about…
Proving the Contract Holds: Testing Database Code
The ended with a contract smoke test: a query that fails the build if a published view loses a promised column or changes a promised type. That test is worth having, and it is not…
Putting the Contract Under CI/CD: Database Deployments You Can Trust
So far in this series the database has a published interface (the ) and a read surface that you keep stable even when an wants to bind straight to your tables. Both of those are…
Reads Are Part of the Contract: A DBA’s Guide to ORM-Generated SQL
In I argued that the database is a published interface, and that the way to keep it changeable is to draw a boundary: a small, deliberate set of views and procedures is the contract, and…