

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. Comparisons in the toolbar lists every saved setup and sets both pickers from the one chosen. It does not need a pair to be chosen first. 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. Select > All covers everything the pane is currently showing, so the search field and Show Identical Objects narrow what it reaches. 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 as soon as there is a pair to list them for, without reading a row. Tables start unchecked. Tick the ones to compare, then press Compare: a data comparison reads every row of every ticked 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.Setting a table’s scope
Select a table, then set its scope at the top of the Rows tab. Each table keeps its own settings.
A filter is a single condition. A semicolon, a comment, or an unclosed quote or parenthesis is refused before either side is read. Press
Return or leave the field to apply it.
- A table with no usable key lists as not comparable rather than being matched on a guess.
- A generated column is read and compared but never written. An identity column the target always generates is inserted with
OVERRIDING SYSTEM VALUEon PostgreSQL andIDENTITY_INSERTon SQL Server, and never updated. - NULL equals only NULL. Numeric tolerance applies to numeric columns and timestamp precision to date and time columns, both set in Options.
- A row with NULL in a key column is left out and counted.
Row limits and filters
With a row limit, the comparison stops after that many keys in key order. Rows past the limit are not read on either side, so none of them is inserted or deleted. With a filter, a row that matches on one side and exists outside the filter on the other is listed as Outside Filter and never written. Widen the filter to sync it.Reviewing rows
Every column shows in a grid. A row only in the source is underlined, a row only in the target is struck through, and a changed row shows its source line above its target line with each differing value marked. Show narrows the grid to All Rows, Difference, Insert, Update, Delete or Same, plus Outside Filter when a filter produced any. Clear a row’s Include checkbox, or select rows and pressSpace, to leave them out of the script. The Include menu above the grid includes or excludes every listed row.
The grid lists up to 5,000 differences and 1,000 matching rows. Past either cap the pane says so, and Apply still covers every difference.

