{"schema":1,"product":"sql-workbench","version":"0.15.128","channel":"stable","commit":"dafa3d0c79aa6ee3c9571e3bf4bfd6356eed866b","published":"2026-10-30T23:25:17.0000000\u002B00:00","requiresLicense":false,"summary":"The schema engine now deploys who may do what, *Compare* can look at SQL Server the way a deployment does, a table change meets the rows already there more safely, more of what Redgate SQL Compare and DacFx let you ignore can be ignored here too, and the schema compare gives its results the room.","notes":"## 0.15 \u00B7 2026-10-30\n\nThe schema engine now deploys who may do what, *Compare* can look at SQL Server the way a\ndeployment does, a table change meets the rows already there more safely, more of what\nRedgate SQL Compare and DacFx let you ignore can be ignored here too, and the schema compare\ngives its results the room.\n\n- **Users, roles, memberships and permissions deploy without DacFx.** A folder that holds\n  \u0060CREATE USER\u0060, \u0060CREATE ROLE\u0060, \u0060ALTER ROLE \u2026 ADD MEMBER\u0060, \u0060GRANT\u0060 and \u0060DENY\u0060 now deploys\n  them through the schema engine: a missing grant is granted, one that went is revoked, a\n  member is added or dropped, a user\u0027s default schema is altered in place. Triggers on the\n  database, assemblies and CLR types deploy too. Reading a database now includes its\n  permissions and role memberships, which DacFx\u0027s extraction never had, so a compare against\n  a database shows them for the first time; security stays out of a compare unless you include\n  it, as before. \u0060CONNECT\u0060, which comes with every user, and what every database grants\n  \u0060public\u0060 by itself are not reported. Application roles, CLR procedures and functions, and\n  logins are still compared as text only.\n- **Eleven more comparison options.** Column collation, nullability, the identity property,\n  the identity increment on its own (*identity seed* now means the seed alone), index padding,\n  lock hints on indexes, STATISTICS_NORECOMPUTE, data compression, NOT FOR REPLICATION, WITH\n  NOCHECK on check constraints, and role membership. Each is a checkbox in the option panel,\n  an \u0060--ignore\u0060 name on the command line and a line in a project file, like the ones before.\n  Index padding is ignored by default, as both products do, so a \u0060PAD_INDEX = ON\u0060 index no\n  longer shows as a difference out of the box.\n- **The compare folds its sources and options after a compare.** The source boxes, the\n  options and the filters above the results fold into one line that names the two sides\n  and the preset and filters in force, so the object list and the diff get the height.\n  The chevron on that line opens them again, from the mouse or the keyboard; changing a\n  side or a compare that fails opens them by itself, and the next compare folds them again.\n  Each compare tab keeps its own.\n- **The splitter between the object list and the diff moves the boundary again.**\n  Dragging it used to stretch or squeeze the bar with Preview and Sync rather than the list,\n  and dragging it far enough up hid that bar altogether. It now moves the edge between the\n  list and the diff, by mouse or by the arrow keys, and stops before either one disappears.\n- **A window saved on a larger screen opens on this one.** When the remembered size or\n  place no longer fits the monitor, the window is shrunk and moved onto it, so its bottom\n  edge and everything along it stay in reach.\n- **\u0060swcli compare --structural\u0060.** Compares a database or a folder by what each object is\n  rather than by its text: \u0060CHECK (Score \u003E= 0)\u0060 and \u0060CHECK ([Score]\u003E=(0))\u0060 are one\n  constraint, \u0060varchar(50)\u0060 and \u0060VARCHAR (50)\u0060 one type, exactly as *Plan* and *Sync* see\n  them. A changed table lists what differs, column by column, where the text compare shows\n  lines; \u0060--json\u0060 carries the same lines. The plain text compare stays the default, and\n  the switch says so plainly when the engine cannot compare structurally (PostgreSQL, a\n  dacpac).\n- **A NOT NULL column without a default stops the deployment up front.** If the table has\n  rows, the script ends before anything changes and names the column, whether or not you\n  allowed data loss, because no setting can fill it. Give it a default and the rows that are\n  there get that value, also when the table has to be rebuilt.\n- **A new check or foreign key is checked against your rows as it arrives.** When rows break\n  it, the deployment fails on that constraint by name and rolls back, instead of leaving the\n  constraint behind half-trusted. One your source keeps disabled is added \u0060WITH NOCHECK\u0060.\n- **A rebuild runs in a transaction of its own.** Even without a transactional deployment, a\n  rebuild that fails half way leaves the old table and no copy behind. The plan now says when\n  a table is rebuilt through a copy, which takes time and room on a large table, so you can\n  choose when to run it.\n- **Identity columns survive a rebuild.** A column that becomes an identity keeps its values\n  and counts on from the highest one; a new identity column numbers the rows in key order.","releaseNotesUrl":"https://svalefelt.ie/downloads/sql-workbench","assets":[{"name":"SqlWorkbench-linux-x64-0.15.128.tar.gz","os":"linux","arch":"x64","flavour":"full","format":"tar.gz","size":28525910,"sha256":"5608315a7add35fce5453bec4c23c92ba596ad322c8d930e3d2232b5ca6fc99c","url":"https://svalefelt.ie/downloads/sql-workbench/file/0.15.128/SqlWorkbench-linux-x64-0.15.128.tar.gz"},{"name":"SqlWorkbench-win-x64-0.15.128.zip","os":"windows","arch":"x64","flavour":"full","format":"zip","size":31585662,"sha256":"af9df73fe1380e6c44c5f1dd8d1f1c7717492be9a82cfb9ec4bf4f38b99fed3a","url":"https://svalefelt.ie/downloads/sql-workbench/file/0.15.128/SqlWorkbench-win-x64-0.15.128.zip"}]}