
A structure comparison grouped by difference, with the source and target definitions side by side
Opening it
- Database > Compare > Compare & Sync Databases…
- Right-click a connection in the connection list and choose Compare/Sync with…. The connection clicked becomes the source.
Choosing the two sides
Source and Target are database pickers, not connection pickers: each one walks connection, then database, then schema. Two databases on one server are a valid pair, and so are two schemas in one database. The source never changes. The target is written to. A connection whose safe mode level is Read-Only is disabled in the target picker with the reason shown, so the refusal arrives at selection time rather than after comparing. Swap reverses the direction. Nothing is written until Apply. Until then the strip along the top reads Comparing only. Nothing has been written.What takes part
Options chooses the object kinds. Tables are always compared; views, materialized views, procedures, functions and triggers are opt-in.
Tables are never compared as DDL text. Driver-rendered DDL varies by formatting and by system-generated constraint names, which reports identical tables as different. A routine has no parsed form to compare instead, so its body is the definition, and the normalizer folds line endings, trailing semicolons and, when the options say so, whitespace and identifier case.
What is ignored
These drift between environments by design, so they are ignored by default. Turn one off to have the difference reported.Reading the results
Each object lands in one of four states: only in source, only in target, different, or identical. Group By sections the table by difference or by object kind, and the search field filters by name. Identical objects stay hidden until Show Identical Objects. Every row carries an Include checkbox, and a group header carries one for everything under it. Nothing is included until it is checked. An object whose metadata could not be read keeps its own Could Not Compare section with the driver’s reason. One unreadable object never stops the rest of the comparison. The detail pane on the right has three tabs. Definitions shows the source and target side by side, split or unified, rendered from the same function so a formatting difference cannot appear as a real one. Rows is the data comparison. Script is the generated SQL.Comparing rows
Switch the mode control to Data. The left pane lists the tables present on both sides. Tables start unchecked. Choose the ones to compare, then press Compare: a data comparison reads every row of every checked table on both sides, so comparing a whole database by accident is expensive. Rows are matched by key, read in key order from both sides and walked in lockstep, so neither side is ever held in memory in full.- Key columns default to the primary key and are editable per table. Composite keys work. A table with no usable key lists as not comparable rather than being matched on a guess.
- The compare set and the write set are separate. Exclude
updated_atfrom the comparison and it is still written on insert and update. - A generated column is read and compared but never written, because engines reject an explicit value for one.
- NULL equals only NULL. Numeric tolerance and timestamp precision are set in Options, and two spellings of the same instant at different offsets are equal.
- When a value is flagged, the row names the rule that fired.


