Your database comparison
and synchronization tool
Diff tool:Introduction  Screenshots  Order now  Revision history  Documentation  
Adept SQL Tools
Diff tool  
Downloads
Ordering
Quotes
FAQ
Contact us

AdeptSQL Diff older versions

15-Sep-2009AdeptSQL Diff 1.96 Build 98

New features

  • Table types: support for user-defined table types (in SQL Server 2008) is added in this version. All table types are loaded, compared and scripted, dependencies correctly resolved.
  • IF NOT EXISTS for all objects: the conditional scripting logic is now implemented not only for tables, but for for all code objects (procedures, functions, triggers, views), database principals, named schemas and user-defined types. Please note that, as before, the IF NOT EXISTS logic is only included into single-database "CREATE" scripts, but not into any synchronization scripts (which are supposedly applied to the target database with a known schema).
  • Accordingly, the option controlling the "IF NOT EXISTS" scripting has been moved from the "Options/Scripting/Tables" to the "Options/Scripting/General Logic" tab of the Options dialog. The options for transaction scripting are now on that same tab as well.
  • Case-sensitive name comparison: although names in SQL Server are usually not case-sensitive, it has always been possible to force case-sensitive comparisons in the Diff. However, with case-sensitive comparison names that only differ in character case were considered different and unrelated. Accordingly, they would be synchronized by DROP/CREATE (rather than by renaming) and, for tables, no data would be preserved. This was not exactly a bug, but this version takes a more logical approach: it would associate these case-changed objects with each other, show the name as "changed" and synchronize by renaming, whenever possible.
  • "Smart" comparison for SYNONYMs: a new option has been added to normalize the "real" names behind synonyms before comparing them. If a synonym refers to an object residing on the same server, database or schema, the corresponding parts will be removed from the multi-part name before the comparison. It means that if, for example, you have a synonym X in [db1].[sch1] referring to "[db1].[sch1].[Table1]" and it is compared against a synonym X in [db1].[sch2] referring to "[sch2].[Table1]", the two will be found identical. The option is on the new "Comparison/Synonyms" tab of the Options dialog.

Bug fixes

  • Error loading XML indexes in SQL 2008: in some situations, the Diff was unable to correctly load column information for an XML index, which caused an "Assertion failed" exception during the comparison. Fixed.
  • NULL keys in DataDiff: when DataDiff generates a synchronization script for table data, it addresses specific records by using "WHERE key1=value1 [AND key2=value2...]" syntax. The key columns in a data comparison are usually not-nullable, but occasionally they can contain a NULL value. Previous versions of Diff didn't recognize such situations and scripted the condition as "key=NULL", although the correct syntax is "key IS NULL". This version scripts the NULL comparison correctly.
  • User-type dependencies: Previous versions of Diff didn't track usage of user-defined types (either scalar or table types) in (a) procedure parameters, (b) function parameters, (c) function return types, (d) inside table definition of a multi-statement table function. In all these situations the referring procs and functions must be dropped before re-creating the types (and afterwards re-created, if necessary). Fixed.
  • Missing schema name in IF NOT EXISTS: with "conditional" scripting enabled, previous versions of Diff used the "IF OBJECT_ID('object_name') IS NULL" condition for tables and other objects, but didn't include the schema name into the condition. This is fixed now.

Known problems

  • Changing schema while loading: A user has reported that certan changes in the database schema, made through a separate connection while it is being loaded into the Diff, would crash the program. Future versions of Diff might implement some (possibly optional) mechanism for locking the database schema during the schema loading operations. Meanwhile, it is recommended to avoid doing any changes to the database while the Diff is loading it.
  • Crashes in single-DB mode: despite the corrections made in in last release, some users still report crashes when trying to create scripts in single-database mode. We haven't been able to reproduce the problem so far, so please do send us a bug report (with whatever details you think might be relevant) if you encounter any such problem.
 

31-Jul-2009AdeptSQL Diff 1.96 Build 97

This version contains a fix for a rare AV which occured when scripting USERs from a single database.

Quick links:

Bug fixes

  • Previous versions of Diff could crash with an AV trying to script USERs in a situation when a single database is loaded (as opposite to an actual comparison), the permission scripting is enabled and there is a certain combination of permissions granted from one user to another. Fixed.
 

27-Jul-2009AdeptSQL Diff 1.96 Build 96

This version supports synonyms and contains some minor corrections.

Quick links: Synonyms, "Ignore expression" options, Upper-casing long scripts, Changing between scalar and table functions

New features

  • Synonyms in SQL 2005/2008 are now fully supported (loaded, compared, displayed and scripted).

Bug fixes

  • "Ignore expression" options didn't work. There are 3 checkboxes on the "Comparison/Details to ignore" options page which allow to completely ignore changes in expressions in the following situations: (a) in computed columns, (b) in DEFAULTs and (c) in CHECK constraints. These options are normally not used, but might be needed when you compare a SQL 2008 database against a similar DB on an older server version. SQL 2008 server internally reformats expressions in a different way than all previous versions, so you might end up with a lot of "false" differences in DEFAULTs/CHECKs/computed columns. These "Ignore" options were supposed to provide a "last resort" solution to this situation, but unfortunately, previous versions of Diff just ignored these settings. This is fixed in Build 96: with the "Ignore expressions" options enabled, any change in expressions is treated as a "minor" difference which is not displayed in the schema tree nor synchronized. The settings for DEFAULTs and CHECKs also affect global DEFAULTs and RULEs, respectively. Swiching the "Ignore" settings displays or hides changes in expressions without the need to actually re-load and re-compare the entire schemas.
  • Upper-casing long scripts: upper/lower-case formatting only worked within the first 64K of a very long selection. Fixed.
  • Changing between scalar and table functions: if one database has a scalar function and in the other DB the function with the same name is defined as a table function, previous versions of Diff would try to synchronize them using ALTER FUNCTION. However, ALTER can't change the type of the function, so in this case the function must be dropped and re-created. The Diff now recognizes the change in the function type (scalar vs. inline table-valued vs. multistatement table-valued function), displays the change in the schema tree difference hint and scripts it correctly.

Known problems

  • An AV of unknown origin was occasionally encountered in Build 95. This problem has NOT been fixed in Build 96, although other corrections in the code might (or might not) have affected the bug.
 

02-Apr-2009AdeptSQL Diff 1.96 Build 95

Changes and improvements

  • Support for partitioned tables and indexes: Previous Diff versions didn't recognize or script the partition clause in tables and indexes ('ON partition_name(part_column)'). This version does script this clause correctly, although it still does NOT display, compare or script definitions of partition schemes (PS) and functions. When re-creating partitioned tables or indexes, the Diff attempts to preserve the original partitioning in the target (rather than the source) database. More specifically:

    • Partition changes are supposed to be ignored. Make sure the "Ignore filegroups" option in "Options/Compare/Details to ignore" is checked! If it isn't, the difference in partition schemes will appear as filegroup difference, but the Diff won't synchronize it.
    • If a new partitioned table (or index) is scripted, and the same PS exists in the target database, it will be scripted as partitioned. If there is no corresponding PS on the target, the Diff won't try to create the PS, will report a warning and script the object without the "ON part_sch(col)" clause
    • When re-creating a table or index that was partitioned in the target database, the Diff will try to script it with the same partitioning as before. If the partitioning column is missing on the source side, the Diff will issue a warning and either substitute it with the partitioning column from the source side (if such exists), or will remove the partitioning.
  • Ignoring index names: An option has been added to ignore name changes for otherwise identical indexes. The "Options/Comparison/Statistics" page is now titled "Statistics and Indexes" and the new option is added there. The reason is that Diff has always had a similar option for named constraints, and index names as usually no more important than constraint names: as long as a table is correctly indexed, nobody would care about the index names.
  • Replacing unsupported data types: When synchronizing from a newer version of MS SQL Server to an older one (e.g. from SQL2008 to SQL2005), the Diff now recognizes column data types that are not supported on the target, issues a warning and scripts the affected column(s) with the closest alternative type. This applies to the following types:

    • TIME, DATE, DATETIME2 and DATETIMEOFFSET are all scripted as DATETIME when scripting from SQL2008 to any earlier version;
    • Any CLR type is scripted as VARBINARY(n) or IMAGE when scripting from SQL2008/2005 to SQL2000 or earlier;
    • XML columns are scripted as NTEXT when scripting from SQL2008/2008 to SQL2000 or earlier.

    Please note the following limitations in Diff's handling of such situations:

    • CLR types GEOMETRY, GEOGRAPHY and HIERARCHYID are predefined in SQL Server 2008, however the Diff treats them as just regular CLR types and will script them as is into SQL2005 target server, even though the target won't recognize them. More generally, since the current version of Diff does NOT track loaded assemblies, it will script any columns of CLR types regardless of whether or not assemblies defining these types are loaded on the target server.
    • The Diff does not specially handle a situation when a column already exists on the target with the correct 'replacement' type. For example, if the left-hand database on SQL2005 has an XML column T.A and in the right-hand SQL2000 database the same column T.A is NTEXT, the Diff will still see the columns as different and try to sync them. Since XML columns aren't possible on the SQL2000 target, the Diff will script it as NTEXT, ignoring the fact that it is already NTEXT.
  • SQL2008 introduces a new type of permission, GRANT VIEW CHANGE TRACKING, which was not recognized by previous Diff versions. This permission is supported now.
  • GRANT formats unsupported on SQL2000: Starting from SQL2005, permissions can be applied to various types of schema objects using "object_class::name" qualifiers (as in "GRANT ... TO TYPE::MyInt..."). Previous versions of Diff supported this syntax, but didn't check if the target SQL Server version does. Now the Diff issues a warning and ignores those permissions if the target server is SQL2000 or older.
  • Permission types unsupported on SQL2000: There are several permission types that first appeared in SQL2005, such as CONTROL, TAKE OWNERSHIP and VIEW DEFINITION. Previous versions of Diff would script these permissions regardless of the target server. Now the Diff issues a warning and ignores those permission if the target server is SQL2000 or older.
  • There are changes in the "Schema/Permissions" schema view node, which displays database-level permissions grouped by principal. In previous versions, just principal name (e.g. "User1") was displayed in each sub-node, which made it easy to confuse with Principals subnodes. Now the display is changed to "To [principal]" for the subnodes and to "Database-level permissions" for their parent node, which makes the display visually distinctive. NOTE: if you access these nodes programmaticaly via Diff Automation objects, you might need to make changes in your scripts! The other change is that principals with only the standard GRANT CONNECT permission are not displayed there (but principals with revoked or denied CONNECT are displayed).

Fixed bugs

  • The command to link renamed objects (in the context menu of the schema tree) finally works. In previous versions it worked for table columns, but not always for top-level objects such as tables or procedures.
  • Extra ALTER AUTH for named schemas: When creating a named schema, previous Diff versions scripted CREATE SCHEMA with AUTHORIZATION clause, then scripted a separate ALTER AUTHORIZATION statement for the same schema. Although not exactly an error, the ALTER was redundant and is now removed.
  • Synch owners for named schemas: when a named schema exists on both sides but is owned by different users, previous Diff versions didn't detect this as a difference. This version does show this as a difference and synchronizes the schema owner using "ALTER AUTHORIZATION..." statement. The feature can be disabled by checking the "Options/Scripting/Schema level/[x] Don't script users" option.
  • Indexes partitioned on non-key columns: A non-clustered index (in SQL2005+) can be partitioned either on one of its key columns, or on a different (non-key) column from the same table. Since previous versions of Diff did not recognize partitioning at all, they would incorrectly report such an index with the partitioning column in the key column list. Fixed: this version correctly scripts partitioned indexes with the partitioning column in the key column list, in the INCLUDE list or in neither of these lists.
  • Statement permissions out of order: When synchronizing the entire database, previous Diff versions would script any database-level permissions prior to any changes in the principals, which could lead to either redundant or incorrect scripts. Fixed.
  • Scripting permissions for new principals: when a user or other principal is created or re-created, permissions granted to that user must be scripted as well. Previous versions of Diff didn't script these permissions, this version does.
  • GRANT CONNECT not required: in SQL2005+, each newly created principal has a CONNECT permission to the database, unless it is explicitly created using the "WITHOUT LOGIN" option. Previous Diff versions scripted the CONNECT along with any other permissions, which was redundant, even though not an error. This Diff version treats GRANT CONNECT as a special case and only scripts it when needed.
  • CREATE USER vs. sp_adduser distinction:Starting from SQL2005, creating a user with 'exec sp_adduser' and with 'create user' produces slightly different results, because 'sp_adduser' creates an implicit named schema as well. In SQL2000 and older, there was no 'create user' statement and no notion of named schemas. When comparing an SQL2000 database (with users defined by 'sp_adduser') against an SQL2005/8 one with users defined by 'CREATE USER', previous versions of Diff would see the difference in the underlying named schemas and and mark the users as different. However, in this context the difference does not make sense and is impossible to synchronize. Now the Diff only makes the "sp_adduser" vs. "create user" distinction if both compared databases are 2005 or newer.
  • CREATE USER vs. sp_adduser in side-by-side view: in some cases the Diff would show a difference hint "create user vs. sp_adduser", but (confusingly) display "sp_exec" on both sides of the side-by-side view. This happens because of an option in Diff that forces it to use backward-compatible syntax in the side-by-side view (e.g. 'exec sp_addtype' instead of 'CREATE TYPE'). When comparing databases on two different server versions, this can sometimes produce side-by-side visual comparison with fewer "false" differences. However, in situations when both databases are 2005 or above, there is no need to stick to SQL2000 syntax. Now the Diff disregards the "Use compatible syntax" options if servers on both sides understand the new syntax.
  • "Smart comparison" of constraint expressions: SQL2000 and SQL2005/8 have different ways to format constraint expressions, for example a DEFAULT formatted as "(1 + 2)" in SQL 2000 would become "((1)+(2))" in SQL2005 or SQL2008. The Diff has an option to ignore such differences in equivalent constraint expressions. However, due to a bug in the lexical comparison algorithm, the Diff still reported differences on some such expressions. Specifically, the comparison didn't work correctly for 'name + number' expressions, such as "@@dbts+(1)". Fixed.
  • Conversions for new date/time types: The internal data type compatibility table in the Diff was not properly adjusted for SQL2008's new types such as DATETIMEOFFSET. As the result, when a column type changed between new date/time types such as DATE/TIME/DATETIME2/DATETIMEOFFSET to a different but compatible type (such as DATETIME), the Diff would re-create the column (and copy the data, if any) instead of just using ALTER COLUMN syntax. Fixed.
  • Starting Diff with ADO missing: One recent optimization in AdeptSQL Diff was that it loads and locks ADO on startup, so that it need not be done on each schema refresh. The disadvantage, however, was that if ADO couldn't be found or initialized correctly, the Diff would immediately display an error message and exit. In this version, the Diff still tries to load ADO on startup, but ignores any errors that might occur. If there is a problem with ADO, it will be reported when you actually run the comparison, not on startup.
  • Ignore INCLUDE() on SQL2000: Indexes with INCLUDE clause were scripted regardless of the target server's version, although the syntax is only supported by SQL2005 and newer servers. In this update, the Diff scripts the INCLUDE commented-out and logs a warning if the target is SQL2000 or below.
  • Precision in TIME types: Diff didn't know that new TIME / DATETIME2 / DATETIMEOFFSET types in SQL2008 can have precision specifiers (as in 'TIME(n)', where N is in 0..7 range). It does script the precision now (when it is different from the default value 7). It now also recognizes and synchronizes precision differences in columns of these types.
  • DataDiff: reversed colors in HTML/XLS export: the "left-only" and "right-only" colors (normally blue and red) were reversed in the exported document. This error is fixed now.
  • Column alignment in DataDiff HTML export: When exporting data comparison results as HTML file, the Diff would right-align all numeric columns. However, in previous versions this alignment was done for the actual column values, but not for the 1st line containing the column names. Now the column alignment in the HTML is specified for entire columns, including both the header line and data. This also leads to a slightly more compact HTML.
  • AV changing portrait/landscape in reporting: for longer DataDiff comparison reports, an attempt to change page orientation in the report preview window from partrait to landscape caused an AV. Fixed.
 

07-Nov-2008AdeptSQL Diff 1.96 Build 94

This version contains a bug fix in schema reading on SQL2000 and improved code generation in certain synchronization scenarios.

Quick links: False ROWGUDCOL flags, Resolving constraint name conflicts

Fixed bugs

  • False ROWGUDCOL flags: In Build 90, some changes were made in the way the Diff reads column attributes from the database. The changed code usually worked correctly with all versions of SQL Server, but on SQL Server 2000 some of the columns suddenly appeared with a ROWGUIDCOL attribute. This was caused by SQL Server returning undocumented bits in syscolumns.status for some columns (while not setting the bits for other columns with apparently exactly the same type and attributes). Fixed.
  • Resolving constraint name conflicts: suppose there is Table_A in the source database and a different Table_B in the target, both using a constraint with the same, explicitly specified, name. When synchronizing, the Diff would script the 'CREATE Table_A' before 'DROP Table_B', therefore causing conflict between the constraint names. This is now fixed in two different ways: (a) the synchro scripts are arranged so that the DROPs go first, and (b) the Diff also specifically looks into possible constraint name conflicts and renames or removes the conflicting constraints.
  • A situation very similar to the one described above is when you add a column with a named constraint to a table, whereas in the target database the same table uses a constraint with this name for another column. Such situations are also correctly resolved now.
 

05-Nov-2008AdeptSQL Diff 1.96 Build 93

This version contains some more bug fixes; options to ignore triggers and indexes.

Quick links: AV on comparison, USE with the wrong database, Ignoring triggers and indexes

Fixed bugs

  • Recent updates had an AV on comparison, which happened in certain rare situations involving computed columns. Fixed.
  • Scripted USE with the wrong database: there is an option in "Scripting/Schema Level" that forces the Diff to script "USE database_name" at the beginning of each script. It worked fine for CREATE/DROP scripts, but for synchro scripts (where it normally isn't needed anyway) it reversed the scripting direction: e.g. if we compare DB1 against DB2 and wanted to script to DB2, it scripted "USE db1" instead, and vice versa. Fixed.

Changes

  • Ignoring triggers and indexes: for a long time, the Diff has had the 2 options in "Options/Scripting/Tables" to include or not to include indexes and triggers with the tables. These options, however, only affected the CREATE scripting, but not synchro scripts. In this version, when you tell the Diff not to include indexes or triggers with a table, it will also ignore them in the synchro scripts. With the "Include triggers/indexes" settings turned OFF, the Diff will behave as follows:

    • In the schema tree, below the table node any changes in triggers or indexes are highlighted as usually, but the changes don't propagate to the table level or the entire schema level.
    • The changes in triggers or indexes remain visible and scriptable from their respective "Summary collections".
    • If any triggers or indexes need to be dropped to resolve some dependencies, they will be dropped regardless of the settings
    • If a table is dropped and re-created, triggers/indexes will not be scripted and therefore will be lost (the Diff will not attempt to restore them from the source database, as it does for permissions/xprops in similar situtations)
 

29-Oct-2008AdeptSQL Diff 1.96 Build 92

This update fixes a critical bug in scripting, first appeared in Build 90.

Quick links: "List index out of bounds"

Fixed bugs

  • Fixed the "List index out of bounds" error introduced in Build 90. Starting from that version, objects to be created and those to be dropped were accumulated in two different lists. Unfortunately, in some situations the wrong list was referred, resulting in either the "out of bounds" exception or incorrect scripting. The bug only affected the "Produce SQL/CREATE from..." and "Produce SQL/DROP from..." commands, not the regular synchro scripting.
 

19-Oct-2008AdeptSQL Diff 1.96 Build 91

Previous versions of AdeptSQL Diff were unable to start on some MS Windows Server 2008 machines. The problem was caused by Diff's DRM wrapper subsystem that didn't support the newest generation of MS operating systems. Starting from Build 91, the Diff is available in two "flavors": the "new" one and the "classic" one. The "new" setup reliably runs on WinServer 2008, but it uses a different activation key format. The "classic" setup uses the same keys as always, but still is unable to run on WS2008.

Note that except for the incompatible activation keys, both the "classic" and the "new" setups have exactly the same functionality. There is no separate licensing for the two variants: once you've bought a license, you can use either setup, although you'll need a different activation key if you switch. Existing users can either stick to the "classic" version (so that they don't need to replace the activation keys), or switch to the "new" setup and then individually request a free replacement activation key using the "Request a key" button in the program.

In any future updates of Diff 1.xx, both setup variants will be updated simultaneously and will have the same version number.

Since we had to make some changes in Diff's activation subsystem (so that it can integrate with either of the DRM wrappers), we are now releasing these two "flavors" as a minor update. In fact, none of the actual Diff functionality has been changed in any way since the last build. If you are not concerned about running the Diff on Windows Server 2008, you can safely skip this update.

Quick links:

Changes

  • The only changes in this version are some minor corrections in the the About box and the Registration dialog. Internally, there are also changes in how the activation keys are handled, but they shouldn't affect you in any way.

Known problems

  • All recent Diff versions have been able to run in "portable" mode (without installation), keeping all their settings in ASQLDIFF.INI and taking the activation key from ASQLDIFF.LIC (in the same directory). However, the "new" setup variant for WS2008 always keeps its activation key in the registry, which makes it inconvenient to use in the portable mode. We do plan to fully implement this feature in one of the future updates.
 

08-Oct-2008AdeptSQL Diff 1.96 Build 90

In this version, the Diff has been updated to work with MS SQL Server 2008. While previous versions of Diff were "mostly" compatible with SQL2008, we had to make a number of changes to support some of the new features. Please see below the details of changes and the list of SQL2008 features that are or are not supported by this version of AdeptSQL Diff.

Quick links: New DATE, TIME, DATETIME2 and DATETIMEOFFSET types, .NET-defined types, SPARSE columns, COLUMN_SET, DATA_COMPRESSION, Partial indexes, ANSI_PADDING compared, Matching "principals", Unnamed constraints in SQL2008, ALTER PROCS in side-by-side view, Adding NOT NULL columns

Supported new features of SQL Server 2008

  • New DATE, TIME, DATETIME2 and DATETIMEOFFSET types: these new internal types are now fully supported.
  • .NET-defined types: The Diff doesn't fully support .NET-defined types, including the built-in types HIERARCHYID, GEOGRAPHY and GEOMETRY, but it is now "aware" of them. Which means that if there is a table with some columns of these types, the columns are correctly compared and scripted. However, the types themselves are neither represented in the schema tree nor compared or scripted.
  • SPARSE columns are now fully supported. The SPARSE attribute is loaded from the database, compared and scripted (using "ALTER TABLE ... ALTER COLUMN ... {ADD|DROP} SPARSE" syntax).
  • COLUMN_SET XML columns are now fully supported.
  • DATA_COMPRESSION attribute for tables and indexes is fully supported.
  • Partial indexes: SQL Server 2008 allows to specify a WHERE condition when creating an index. These are fully supported in this update.

Features of SQL Server 2005/2008 that are NOT supported

    Generally, no "new" objects that appeared in SQL 2005 or 2008 are supported or going to be supported in the current Diff 1.XX release or subsequent minor updates. Most such objects have already been implemented in Diff 2.0 and will be available once that new version of Diff is released. Examples of such "new" objects are .NET-related objects (ASSEMBLIES and .NET-defined types, procedures and functions), Service Broker objects (queues, contracts, services, etc) and various encryption-related keys and certificates.

    However, whereever a new feature, such as a new column type or table attribute, extends a common schema object and may interfere with the comparisons, we try to implement it as fully as possible in the "minor" Diff 1.XX updates Diff, so that customers who utilize such enhanced functionality in their databases can continue to use the Diff. Specifically:

  • Partitions: currently partition information is not loaded from the database. If a table or index is partitioned, the Diff doesn't recognize the difference and wouldn't script the "ON ..." clause. It is possible that some limited support of partitions would appear in a future 1.XX update (e.g. scripting them in table/index definitions, but not treating partitions and partition functions as "first class" schema objects to be compared and scripted). Full support for all partitioning-related object is being implemented in Diff 2.0.
  • FILESTREAMs: this version hasn't been tested with SQL2008 filestreams, so it is not known how the use of this feature in your databases would affect your comparisons. We plan to fully support FILESTREAMs in the next 1.XX update.
  • SPATIAL INDEXes: this version hasn't been tested with SQL2008 spatial indexes, so it is not known how the use of this feature in your databases would affect your comparisons. In the next 1.XX update we will verify that such indexes are safely ignored and don't affect your comparisons. Full support for this feature will be included in Diff 2.0.
  • Service broker: any SB objects are ignored by Diff 1.xx. Full support for all such objects (message queues, contracts, endpoints, routes, etc) has been implemented in Diff 2.0 and will become available whenever that new version is released.
  • Keys and certificates: any such objects are ignored by Diff 1.xx. Full support for keys and certificates has been implemented in Diff 2.0 and will become available whenever that new version is released.
  • Assemblies and CLR-defined objects: of all the variety of CLR-related schema objects, the current version of Diff only recognizes CLR-defined types and only to the degree necessary to script columns that refer them in table definitions (see above). The Diff has not been extensively tested with other types of CLR-defined objects (procedures, functions, triggers), so it is not known whether they can interfere with its comparison and scripting. We plan to conduct such testing and make sure that Diff 1.XX is aware of such objects and safely ignores them. Full support for .NET assemblies and CLR-defined objects already exists in Diff 2.0 and will become available whenever that new version is released.
  • Fulltext search: fulltext indexes and catalogs are ignored in Diff 1.xx. Unfortunately, this might break synchro scripts generated by the Diff when the presence of a fulltext index prevents a table or its columns from being dropped. We might have to add some limited support for text indexes (so that they can be detected as dependencies and dropped/re-created accordingly) in a future 1.XX update. Full support for fulltext catalogs and indexes has been implemented in Diff 2.0 and will become available whenever that new version is released.
  • Datamining and "cube" extensions (DMX, MDX): the current version of Diff doesn't support them and so far we don't plan to support them in Diff 2.0 either.

Changes not specific to SQL2008

  • ANSI_PADDING compared: behaviour of character and binary columns may be affected by the ANSI_PADDING setting during the table's creation. The server keeps the state of this setting with each column, so it actually becomes one of column attributes and as such should be compared and scripted. Before this version, the Diff ignored the ANSI_PADDING attribute, now it loads it and can (optionally) compare and script it. A new checkbox "Compare ANSI_PADDING" has been added to the 'Scripting/Tables' options page. This option is OFF by default, so the Diff will continue to ignore the ANSI_PADDING attribute until you instruct it otherwise. Even when ANSI_PADDING comparison is enabled, the Diff won't be able to script the situation when individual columns within one table are created with different ANSI_PADDING. Instead, a warning will be issues and the entire table scripted with ANSI_PADDING ON.
  • Matching "principals": We changed the way database principals are compared. Although all such objects are listed under the same node of the schema tree, previous versions of Diff would only match user vs. user, role vs. role, approle vs. approle. In this version, principals with the same name but having different type (such as user 'tester' vs. role 'tester') will be paired.

Fixed bugs

  • Unnamed constraints in SQL2008: The Diff recognizes automatic names that SQL Server gives to unnamed table constraints, marking such constraints as "unnamed" in the loaded schema and subsequently not including those name in the script. This feature didn't work in SQL2008, because the server now uses a slightly different format for the automatic names. Fixed.
  • ALTER PROCS in side-by-side view: The Diff has an option to re-script any views and procedures referring a column or table that has been changed. This feature was intended only for the actual synchro scripts, but (incorrectly) the dependencies were scripted in the side-by-side view as well. With a lot of procedures in the side-by-side panels, that could make the textual comparison very slow or even crash. This problem has been fixed by not allowing the dependencies to be scripted for the side-by-side view.
  • Adding NOT NULL columns: the server doesn't allow adding NOT NULL columns unless they have a DEFAULT. The Diff knows this and assigns a temporary DEFAULT that is dropped afterwards. However, SQL 2005 and 2008 only require this default if the table has data in it (whereas SQL2000 requires it for any table). The new version of Diff recognizes this nuance as well and doesn't generate temporary DEFAULTs when adding NOT NULL columns to empty tables in SQL 2005 or 2008.
 

27-Sep-2008AdeptSQL Diff 1.95 Build 89

This update contains many changes and corrections, most importantly the improved error handling in DataDiff and a lot of changes in SQL scripting logic, especially processing database principals and object ownership. Please see below for the complete list of changes.

Quick links: Optional "USE target_db_name", PAD_INDEX made optional, Dependencies of principals, "exec sp_addtype" vs. "create type", Look-ahead for objects to be scripted, Restore permissions after ALTER AUTHORIZATION, Can''t script permissions to owner, Permissions for XML Collections, Ownership for types and XML collections, Index options in brackets, Owner created with "Ignore owners", Must not drop DBO, Missing "USE", Not enough permissions, Spaces in DataDiff row filter, [N]TEXT and IMAGE

New features

  • Optional "USE target_db_name" statement at the beginning of any script: Although explicitly setting the current database is normally not required when you execute synchronization scripts in the Diff itself, it may be useful if you save the script and then run it from an external tool at a later time. This version of Diff includes an option to enable scripting of "USE target_db_name" at the beginning of any script the Diff generates. This options can be found on the "Scripting/Schema Level" page of the Options dialog. It is OFF by default, so the Diff won't generate the database selection command unless you ask it to.
  • PAD_INDEX made optional: an option was added to the "Ignored details" options page to ignore or compare the PAD_INDEX attribute.
  • Dependencies of principals: In SQL2005 and newer, a lot of various database objects (and not only the usual 'sysobjects' like tables or procs) can be made owned by a specific database principal (user, role, etc) using the ALTER AUTHORIZATION statement. If the principal is being removed, all these objects must be first "re-owned" to their schema or to DBO. Previous versions tracked those dependencies only for 'sysobjects' and named schemas, this update also tracks UDTs, XML schema collections and even object types that are not otherwise supported by Diff 1.xx (encryption, service broker, assemblies)
  • "exec sp_addtype" vs. "create type": although these two ways of defining a UDT are equivalent, there is a quirk in how SQL Server handles them: "sp_addtype" additionally grants REFERENCES access to PUBLIC, whereas "create type" doesn't. Previous versions of Diff counted that as a difference in permissions, which was technically correct, but confusing. In this version, this particular "permission" is used by set an "old style" flag in the UDT object, but is not added to the permission list. The "old style" flag determines how the UDT definition will be displayed in the side-by-side view, but otherwise is ignored. It is not considered as a difference when comparing the types.
  • Look-ahead for objects to be scripted: when an object is going to be dropped and the Diff is removing its dependencies, it is often possible to "move away" the dependent objects non-destructively as opposite to dropping them. For example, when dropping a UDT, we can either drop columns of that type or revert them to the underlying physical type. Obviously, if a column or table is going to be dropped anyway within the same scripting operation (e.g. the entire database was selected for scripting), it's easier to drop them at this point. Otherwise, the Diff must not destroy columns it was not asked to sync them. In previous versions, the Diff lacked the mechanism to look ahead and check if a particular object was selected for scripting. Now this has been added.

Fixed bugs

  • Restore permissions after ALTER AUTHORIZATION: re-owning an object resets all permissions granted to it. When re-owning in the process of dropping a principal, permissions must be restored afterwards. Previous versions of Diff were aware of that, but didn't always restore the permissions correctly. Fixed.
  • Can''t script permissions to owner: it is possible to construct a situation where in the "source" database a securable object such as a table has permissions granted to a pricipal, whereas in the target DB the same object is owned by that same principal. The Diff would then attempt to sync those permissions, however the SQL Server does not allow GRANTing permissions to the principal who owns the object. In this version, the Diff would recognize this situation, issue a warning and skip those permissions.
  • Permissions for XML Collections: Although XML Schema Collections were added to recent versions of Diff, permissions for them were not loaded from the database. Fixed.
  • Ownership for types and XML collections: these objects were supposed to support explicit ownership (scripted by ALTER AUTHORIZATION), however previous versions didn't correctly load the ownership information from the database. This is fixed now.
  • Index options in brackets: before this update, the Diff used obsolete syntax for index options such as FILLFACTOR ("CREATE INDEX ... WITH FILLFACTOR=..."). This worked with the particular FILLFACTOR option, but other options such as PAD_INDEX require the new "WITH (option_name=ON|OFF,...)" syntax. This is implemented now: depending on the target server version, CREATE INDEX is scripted with either old or new syntax. See also (above) a new setting to ignore changes in the PAD_INDEX.
  • Owner created with "Ignore owners": in a rare situation when the databases are compared with "Ignore owners", objects may be associated with each other even when they belong to different schemas, e.g. [User1].[Table1] in the source db will be matched to [dbo].[Table1] in the target. This is by design. When such a table is synchronized, all changes will apply to [dbo].[Table1]. This includes the situation when the target table must be dropped and re-created: the new table is created as [dbo].[Table1], not [User1].[Table1]. So far so good, except that in previous version the Diff would first create [User1] (incorrectly) before re-creating the table (correctly, as [dbo].[Table1]). The problem has been fixed in this update: the Diff now doesn't create the user that shouldn't be in the target DB.
  • In previous versions, when changing type of a principal (e.g. from user to app role), all objects owned by this principal were moved to DBO. This (a) created possibility of a name conflict in DBO namespace and (b) the Diff should then move the objects back to the re-created principal, which it didn't. The correct solution would be to move the objects into a temporary schema (or app role), then move back to the re-created owner.
  • Must not drop DBO: In some rare situations when comparing with "owner mapping", the Diff would try to remove the built-in user/schema [DBO] from the target database. In this version, none of the built-in schemas/users can be dropped.
  • Missing "USE" for a new database: when the Diff was configured to include the CREATE DATABASE scripting, it didn't switch to the created database before scripting any other objects. Fixed. Note that in this situation the "USE" statement is generated unconditionally, regardless of the new "Script USE" option described above.
  • The recently added check for the minimum required permissions does not work in some [rare] situations, breaking the scan with "Not enough permissions to even attempt reading schema" error, although in fact the schema could be read. In this version, the permission check still exists, however it only displays a warning without breaking the scan.
  • Spaces in DataDiff row filter: if you put some spaces in the row filter expression field of DataDiff (as opposite to just leaving it empty), a "WHERE " clause with this empty expression would be included in the resulting query, which subsequently fails. Generally, DataDiff doesn't validate the filter expression so you are responsible for any incorrect syntax, but in this particular situation the spaces are not easily visible and may be very confusing. This version of Diff trims any leading/trailing spaces in the filter expression, so an "expression" containing only spaces will be ignored.
  • [N]TEXT and IMAGE data conversion path: when column type changes from TEXT or NTEXT to IMAGE or back and the Diff must preserve the data, simple data conversion to the destination type won't work. In these situations, the Diff now uses two-step conversion through VARBINARY(MAX) and [N]VARCHAR(MAX) types. The correction applies both in schema sync (when the Diff tries to preserve data while changing a column type) and in DataDiff, when synchronizing data in sever-to-server mode.
 

06-Feb-2008AdeptSQL Diff 1.95 Build 88

Bug fixes

  • IDENTITY Seed/increment parameters weren't loaded correctly for tables defined in named schemas. In SQL2000 and before, there were no named schemas but only owners; in SQL2005 an object can have distinct schema and owner. Trying to obtain IDENTITY seeds/increments for tables, the Diff incorrectly used owner names instead of schema names. Fixed.
  • DataDiff: columns stuck in "digest" mode: sometimes when the last column of a record was a BLOB loaded in "digested" mode, the first column in the next record would also be loaded (incorrectly) as "digested", because an internal flag was not consistently reset. Fixed.
  • Owner filtering didn't work: when you tried to get only objects from a particular schema, the Diff still loaded objects from other schemas as well. This functionality is now restored. However, please be aware that with only part of the metadata loaded, some of the dependencies may be lost and the Diff may not be able to generate correct script in all situations. Any FOREIGN KEYs pointing from a loaded table to a filtered-out one will NOT be loaded.
  • No messages on aborted scans: when a database scan was aborted for any reason, the message panel did not appear and so the user was left without any information about what exactly had happened (on the other hand, when there were warnings but the comparison completed, the messages were displayed). Fixed.
  • Insufficient permissions were not reported: the minimal database-level permissions required to perform the schema scan are SELECT + VIEW DEFINITION. For a SELECT-only login, most of the scan can be performed correctly, but definitions of views/procedures/triggers/functions as well as any expressions in DEFAULT/CHECK constraints would be unavailable. The Diff did not recognize this as a problem and provided no diagnostics when it happened. Now the Diff logs an error message when you scan the database without the VIEW DEFINITION permission, then later when a DEFAULT or CHECK is being scripted, the Diff checks for empty expression, inserts '???' instead and logs another error.
  • Out-of-screen popup windows: the Diff remembers size and position of popup windows such as the SQL editor or DataDiff. If the screen resolution changes, it might happen that these windows popup entirely outside the screen bounds. The result could be very confusing: you press a "show script" button, the main window loses focus, but no editor window becomes visible. This version validates the stored window positions against the actual screen size, not allowing more than half of the window to stick out.
  • Switching off constraint scripting: the "Constraint placement" option allows to specify how each kind of constraints should be scripted: on the column level or on the table level or separately or not at all. These settings were correctly applied when scripting a new table, but when altering a table the only possible way to script constraints is by a separate ALTER statement, so synchro scripts the "constraint placement" setting was entirely disregarded. However, the "don't script" option must still be taken into account when synchronizing constraints. This functionality has been restored in this release.
  • Side-by-side refresh after changing options: When you change some options affect scripting, the scripts in the side-by-side view didn't reflect the changes until you double-click on the schema tree to refresh the side-by-side view. Now any relevant changes in scripting options are immediately reflected in the side-by-side scripts.
  • Unneeded "-- *Constraints**": when a table has constraints, the Diff would show the "-- *Constraints**" section divider in the side-by-side view even when all those constraints were scripted inside the table. Fixed: now this section divider is only shown if at least one of the tables actually has some constraints to be shows there.
  • Link/unlink commands didn't work. This feature is now fully implemented, you can link/unlink columns as well as first-level objects (such as procedures or tables). All the associations are saved with the project when you use the "File/Save comparison" command and automatically applied when you later open the comparison. The Diff synchronizes associated objects by using an appropriate combination of 'sp_rename' and ALTER commands.
  • DataDiff incorrectly handling query errors: DataDiff did not correctly handle possible errors reported by the server when reading table data. Such errors can routinely happen if the user specifies an invalid filter condition, so the Diff is supposed just to report the error, stop loading the data and cancel the data comparison. Instead, such errors caused a cascade of AVs. Fixed.
  • Tab order on connection panel: controls on that page were not correctly ordered for navigation with the Tab key. This is fixed now.

Changes

  • Filegroups in indexes and tables: Diff now handles a bit differently tables and indexes with non-default, non-matched filegroups. Consider the following example: database A has an extra filegroup FG and table T is placed into this filegroup. Database B doesn't have any additional filegroups and it also has table T which is placed in the PRIMARY group, but is otherwise identical to its counterpart in db A.

    In this situation, previous versions of Diff would ignore the filegroup difference in table T regardless of the "Ignore filegroups" option (in "Options/Comparison/Details to ignore"). That was by design and it made a kind of sense, because how could the Diff sync that without adding the group first? On the other hand, if there is an option to ignore or compare filegroups, the Diff must not simply ignore it.

    This version, in the situation described above, would mark or ignore filegroup differences depending on the "Ignore filegroups" option. If you try to sync an object which refers to a filegroup missing in the target database, the Diff would report a warning and generate a commented-out "/* ON [filegroup] */" clause.

  • Keeping original filegroups: when a sync script needs to re-create a table or index in the target database, that table or index was in a non-default FILEGROUP and we compare with "Ignore filegroup" option, that table or index should be re-created in the same file group where it originally was. In this situation, previous versions would not include the filegroup clause at all, so the object would be re-created in PRIMARY of whichever filegroup happened to be the default one. Now the Diff correctly handles this.
  • Ignored changes in named SCHEMAs: the option "[x] Don't script users/groups/roles..." on the "Options/Scripting/Schema level" page also used to control comparison of named schemas: with this option checked, changes in the named schemas did not result in the database tree's root node marked as changed. Which means schemas were only synchronized when you selected the "Named schemas" node or when there were tables depending on these schemas, but not when you synced the entire tree. Although that was by design, such behaviour was rather obscure. The current version compares named schemas regardless of that scripting option.
  • CHECKs not paired: unnamed CHECK constraints for the same column were not associated with each other, even if similarity between them was obvious for a human eye. For example, 'CHECK(id > 0)' on one side and 'CHECK(id >= 0)' would not be paired, because the Diff didn't analyze the expressions. In this version, the Diff still can't fully analyze the expressions, but it does support one common situation: when on each side there is just one unnamed CHECK constraint referring a particular column, these CHECKs are paired. Note that although the improved pairing is good for viewing the changes, it has no effect on the generated synchro SQL, because whether the CHECKs are paired or not, the only way to sync them is to drop and re-create.

Known issues

  • The Diff detects a difference between a data type defined by 'exec sp_addtype' and an identical type defined by "create type" (in SQL2005). The reason seems to be that the 'exec sp_addtype' additionally creates a REFERENCE permission to PUBLIC while the "create type" doesn't. This is a quirk of MS SQL Server rather than a problem in the Diff, although the Diff should eventually implement some logic to work around the issue. Meanwhile the workaround is to disable permission comparison.
 

03-Aug-2007AdeptSQL Diff 1.95 Build 87

Bug fixes

  • SQL2005 syntax to DROP from SQL2000: when comparing a SQL2000 and a SQL2005 database and scripting for the SQL2000 one, the Diff incorrectly generated some DROP statements using SQL2005-specific syntax. In particular, it would try dropping indexes using the "DROP INDEX index_name ON table_name" syntax, not supported on SQL2000. The problem was caused by some scripting code checking the server version on the wrong side of the comparison. Fixed.
  • UDT in CONVERT(...): When the Diff generates a script to re-create a table and re-insert data from the original one, it generates CONVERT(...) expressions for columns whose types have changed. When a new column is specified via a user-defined type, the Diff would use the UDT name in the CONVERT(). This was an error, because the server only allows built-in type names in the CONVERT(). In this version, the target type inside a CONVERT is always the actual (physical) data type.
  • Recreating tables unnecessarily: The Diff generates code to re-create a changed table when it decides that some of the changed columns can not be synchronized simply by using some kind of "ALTER TABLE..." statement. However, any column of TEXT/NTEXT/BLOB type would trigger table re-creation, even if there is no changes in this particular column. Fixed.
  • Missing owner name while re-creating table: when a table belonging to another user is being re-created, the Diff forgets to script the owner name in several places: (a) when renaming the primary key and (b) when accessing the temporary name that the original table was renamed to. Fixed.
  • ON DELETE SET NULL|DEFAULT: Previous Diff versions only recognized the CASCADE action in foreign keys (as in SQL2000), but not the SET DEFAULT|SET NULL actions introduced in SQL2005. This update implements those actions as well.
  • Fixed a minor memory leak reading the metadata.
  • Option "[x] Recreate dependent Views..." in "Options/Scripting/Tables" also affects scripting of dependent procedures and function, which was not obvious. The wording has been changed to reflect this behaviour.
 

22-May-2007AdeptSQL Diff 1.95 Build 86

This update contains a number of important corrections and improvements in the comparison and scripting engine. Please see below for the complete list.

Quick links: PERSISTED attribute, NOT NULL on PERSISTED, Names with leading dot(s), Renaming issues

Bug fixes

  • The PERSISTED attribute in computed columns was ignored. In this version the attribute is correctly obtained from the database, compared and scripted. The Diff now uses 'ALTER TABLE ... ALTER COLUMN ... ADD|DROP COMPUTED' when appropriate.
  • NOT NULL on PERSISTED columns: In SQL2005, computed columns with the PERSISTED attribute are exactly like any regular column in that they can have the NOT NULL attribute and any kinds of constraints normal columns could. This functionality has been added.
  • Names with leading dot(s): The Diff generated an error on procedure definitions like 'CREATE PROC .ProcName'. Having the leading '.' in object names turns out to be a valid syntax (and some of MS corporate solutions happen to have a lot of such notation in their DBs). Now the new version happily eats away any valid combination of dots and names. However, it will NOT use the same notation when scripting, so any leading dots in procedure names will be lost after synchronization. Objects with and without the '.' prefix in the object name in CREATE PROC|VIEW|etc ... (but otherwise identical) are treated as identical. The '.' prefixes inside object bodies are compared and scripted 'as is'.
  • When a computed column's expression with something like '...CHAR(13)...' is begin ported from SQL2000 to SQL2005, the SQL2005 server saves it as '...CHAR((13))...' (with an extra level of parentheses added). When re-comparing, the Diff sees that as a difference and so tries to synchronize the computed column again. The "Smart comparison" option (which was added specifically to handle such situations) didn't worked. Fixed.
  • Renaming issues: Renaming PK/UQ constraints, indexes and statistics could cause name conflicts, because indexes and statistics share the same namespace and the PK/UQ constraints rely on indexes with the same name. Besides, both PK/UQ and indexes can be CLUSTERED and there can be only one clustered index/constraint per table. Therefore, before renaming or adding a specific object, the Diff must find and either rename out of the way or drop any conflicting ones in the target database. This functionality has existed in previous versions, but we found several situations where it didn't see a conflict and the produced scripts were incorrect. Fixed.
  • If there are several indexes to create, the clustered one (or the clustered constraint) should be created first, to avoid re-building nonclustered indexes when a clustered index is created). Done.

Known problems

  • It seems that when a user cancels a DataDiff comparison (e.g. because the datasets are too large), the program leaves some (or both) of the SELECT statements in a 'suspended' state, even after the user proceeds to compare some totally different databases. These open connections (and locks) can lead to problems if some other client attempts to access that table. The issue is NOT solved in this version, but a workaround is simple: exit and restart the Diff after a cancelled comparison to make sure all connections are closed.
 

07-May-2007AdeptSQL Diff 1.95 Build 85

This update contains some corrections. See below for the complete list.

Quick links: Synchronizing clustered indexes, "Reading AUTHORIZATION overrides"

Bug fixes

  • Synchronizing clustered indexes with different names and column lists, the Diff tried to create the new index before dropping the old one. Since a table can only have one clustered index, the synchro script failed. A similar error happened when a table contained a clustered index and its pair table had a clustered PK or unique constraint. In this version, the Diff checks all such situations and makes sure to drop the clustered index / constraint, if any, before creating a new one.
  • On some machines, a database scan occasionally failed during the "Reading AUTHORIZATION overrides" step. This intermittent error appears to be caused by the fact that during the step the Diff created a new SQL query before closing the previous one, so that ADO had to allocate one extra connection and on some systems that probably was one connection too many. In this version, the "Reading AUTHORIZATION" step is done without creating an extra connection, so that should solve the problem.
 

07-Apr-2007AdeptSQL Diff 1.95 Build 84

This update fixes a problem with TCP/IP connection to a remote server and contains several important corrections in DataDiff, which mostly have to do with handling of GUID columns.

Quick links: Missing port number connecting to remote server, "Digest threshold" option, "Digested" GUIDs in DataDiff, Error reading NULL value in a GUID column

Bug fixes

  • Missing port number connecting to remote server. When connecting to a remote SQL server via TCP/IP, the OLEDB driver expects to find both the IP address and the port number in the connection string, whereas the Diff incorrectly assumes that the "standard" SQL port 1433 will be used by default and so doesn't include the port number 1433 (although it does include any other port number). Fixed.
  • There is a "Digest threshold" option in "Options/Data Comparison/General" which is supposed to be just a default, overridable for any particular column. However, the DataDiff incorrectly used this global setting even if a column-level override was specified. Fixed.
  • "Digested" GUIDs in DataDiff: if a "digested" BLOB column is immediately followed by a UNIQUEIDENTIFIER column, the GUID is also displayed (incorrectly) as a "digested" value. This happened either when the two columns are adjacent on the same row, or when a "digested" value is the right-most column and the GUID column it goes first on the next row. Fixed.
  • Error reading NULL value in a GUID column. Reading columns of type UNIQUEIDENTIFIER, the DataDiff didn't check for NULL value and any such value would cause a variant conversion error, breaking the data comparison. Fixed.

GUI improvements

  • When you are trying to INSERT a row with "digested" BLOB(s), the DataDiff (correctly) refuses to script it. However, the explanation message goes into the main form's error log panel and isn't shown in the pop-up error msgbox. If the DataDiff window is maximized or otherwise obscures the error log panel, you won't see what's actually happened, which is confusing. The correct solution would be to give DataDiff its own error log panel, meanwhile the popup message has been changed to tell you where to look.
 

12-Mar-2007AdeptSQL Diff 1.95 Build 83

This update fixes three different "access violation" exceptions reading/comparing the schemas, which only happened in certain rather exotic situations. Other than that, there have been no changes in Diff 1.95 since the last release.

Quick links: Exception after dropping objects and automatic one-side rescan, Exception reading FOREIGN KEYs (rare), Exception reading indexes on SQL 2005 (rare)

Known problems

  • Failed test with re-creating "user" as "approle", etc. Objects owned by this user are re-owned to "dbo", but aren't re-owned back once the user is re-created.

Bug fixes

  • Exception after dropping objects and automatic one-side rescan. When you script DROPs for all objects in a category (e.g. all procedures) then apply the script to the right-hand database, and the Diff is configured to auto-refresh schema after running a script, the Diff would crash. This happened because the Diff only reloaded the right-side (changed) schema and some references to the deleted objects remained in the other one. Fixed: now the Diff properly cleans up its internal links before each comparison.
  • Exception reading FOREIGN KEYs (rare). There appeared to exist a rare situation when the Diff would not correctly read from the database the referenced (target) table for a FOREIGN KEY. That would result in an "Access violation" exception while comparing or later displaying the schema. Although we were unable to reproduce the situation or fully understand how it could happen, additional checks have been added to the schema reader to report and discard any "incomplete" FKs before they are added to the in-memory schema model. We'd be very much interested to see examples of such incomplete FKs and the relevant SQL scripts.
  • Exception reading indexes on SQL 2005 (rare). Each UNIQUE and PRIMARY KEY constraint in MS SQL has its underlying index. The server keeps records for the constraint itself and for its index in separate system tables. The two are associated by name and the server normally keeps both names in sync even when either constraint or index is being renamed. However, it seems to happen sometimes that a PK name gets upper-cased on the server whereas its corresponding index name remains as originally entered. When that happened, the Diff would fail to associate an index with the PK, causing an "Access violation" error. This only affected reading indexes from MSSQL2005 servers. The only way we were able to reproduce the problem was by manually changing one of the names in [sysobjects] (under SQL 2000), then re-attaching the database to a SQL 2005 server. Since several users have reported the problem, it is likely that such inconsistency in the system tables was caused by some SQL 2000 database management tool which directly modified the system tables before the database was transferred to SQL2005. In this version, the schema reader has been modified to properly handle such situations.
 

25-Dec-2006AdeptSQL Diff 1.95 Build 82

This update implements XML Schema Collections in MS SQL 2005, improves scripting of XML columns in DataDiff and contains several other corrections.

Quick links: XML schema collections, "Permission #0 not expected here" error, DataDiff corrections, Error reporting

New features

  • AdeptSQL Diff now fully supports XML schema collections in SQL2005. We didn't plan to add this feature before Diff 2.0, however the absense of XML schemas made it difficult to add or synchronize typed XML columns.

Bug fixes

  • Fixed the "Permission #0 not expected here" error, which sometimes occured when reading database-level permissions in SQL 2000. This was caused by an undocumented permission code which, apparently, MS uses in some of their ecommerce solutions. The undocumented permission code doesn't seem to correspond to any database-level permission you can explicitly specify, so the new Diff simply ignores it.
  • DataDiff corrections: The server-side DataDiff synchronization between typed XML columns (those with XML schema collection) caused server errors, because in this situation the server wants to see an explicit type conversion. Fixed.
  • When comparing columns of different SQL types, DataDiff didn't report them in the column configuration dialog as having different types (e.g. "uniqueidentifier/varchar(36)"), but only displayed the type of the left-hand column. Fixed.
  • Comparing a UNIQUEIDENTIFIER column against a VARCHAR column (with the same GUID converted to a string) produced a mismatch, because DataDiff formatted GUIDs with surrounding '{}', whereas SQL conversion of a GUID to a string doesn't include the brackets. Fixed (by removing the brackets).
  • Error reporting: When incorrect connection parameters (e.g. a wrong password) were specified for one of the databases, the Diff would report the error, but would not tell in which database it happened. This version does specify "Left-hand DB" or "Right-hand DB" in the error message.
  • In the same situation as above (wrong connection parameters or other error during the schema scan), each error was reported twice. Fixed.
  • When the Diff was configured to ask for confirmation before refreshing one of the schemas (after applying a change script to it), it always displayed the name of the right-hand schema in the confirmation dialog, regardless of which schema is in fact going to be reloaded (although it did reload the correct side of the comparison). Fixed.
  • After you've executed an update script in Diff's SQL editor, the Diff remembers that the schema might have been changed and need be reloaded. When you are closing the editor window, the Diff would ask if you want to reload the schema. However, if you manually re-load the schemas while the SQL editor is open, the Diff doesn't reset the "dirty" flags and still thinks it needs a reload. Fixed.
  • Primary keys with different key columns are correctly displayed as changed and correctly synchronized, however there was no "tooltip" description for the change (i.e. when you place the cursor over the changed PK). Fixed.
 

04-Dec-2006AdeptSQL Diff 1.95 Build 81

AdeptSQL Diff 1.95 has been finally released. The only changes since the last Beta are some small corrections in DataDiff code generation and in the GUI, otherwise the Diff looks quite stable. Although occasional bugfix updates are still possible, from now on the development efforts will be focused on AdeptSQL Diff 2.0, the next major version of the program.

Quick links:

Bug fixes

  • DataDiff scripting generated all string literals as N'...' even if the column was not a Unicode one. Fixed: now the Diff generates N'...' literals only for Unicode columns (NCHAR()/NVARCHAR()/NTEXT()).
  • DataDiff scripting didn't use the Uppercase/Lowercase formatting options. Fixed.
  • In SQL 2005, when scripting REVOKE permissions from users, schemas and other entities, the last version of Diff would not include the type qualifier (as in 'revoke control on USER::user1 from user2') required by the MS SQL syntax. Fixed.
  • When changing from a column-level permission to a table level one, the last version of Diff would script them in a wrong order, e.g. 'GRANT UPDATE on T to user2; REVOKE UPDATE on T(col1) to user1;'. In this situation revoking the old column-level permission is redundant, but even if it is done, it must be done first. Fixed.
  • Some static elements on the connection panel were not reliably repainted when the Diff window was coming to the foreground. Fixed.
 

05-Nov-2006AdeptSQL Diff 1.95 Beta 80

This version contains some more corrections (especially in scripting of object permissions). Our internal testset is up to 668 tests now!

Quick links:

Bug fixes

  • Changes in PK columns were ignored by the Diff. Fixed.
  • Modifying table columns referred by a computed column would sometimes cause an exception. Fixed.
  • Permissions: when revoking a permission WITH GRANT OPTION, the Diff didn't script the CASCADE clause, which is required in this case. Fixed.
  • Permissions: when there are column-level permissions in the source DB, but only object-level permissions in the target, an attempt to script the difference would cause an exception. Fixed.

Known problems

  • An exception has been reported after executing SQL in the built-in editor. It is likely to be caused by a particular SQL script and hasn't been reproduced yet.
  • An assertion error has been reported loading permissions. We made a SQL script which enumerated all valid combinations of database-, object- and column level permissions. The script generated over 150 individual permission-setting tests for SQL 2005 and 28 tests for SQL 7.0/2000. The Diff has successfully passed all these tests, so that didn't help us to reproduce the problem. Some permission-related corrections have been made as well, but it is not known whether this particular assertion error got fixed or not.
 

15-Oct-2006AdeptSQL Diff 1.95 Beta 79

Some more corrections - see below.

Quick links: DataDiff reporting

Changes

  • The help file has been updated.
  • When the Diff syncronized (added) filegroups, it didn't add files to them. This was done by design, kind of, because file paths on the target database would certainly be different from those in the source DB. In both SQL2000 and SQL2005 (but not on SQL 7.0), the server would even allow tables and indexes to be created on such an empty filegroup. However, some files must be added before the tables could be populated with data, which means that in such situation the Diff leaved the database non-functional, with a difficult to find problem inside. In this version, the Diff extracts the default data file path of each database (that is, where its PRIMARY filegroup resides) and will create paths for the new files from that. More than that, it checks if a particular file name is already in use in the target database and modifies it with a unique numeric suffix, if necessary.
  • For an unchanged item selected in the schema tree, the Diff used to replace two separate menu commands "Script CREATE from left DB"/"...from right DB" with a single "Script CREATE" command, on the assumption that the two scripts would be identical anyway. However, starting from version 1.95, the Diff can be configured to ignore certain differences. So even if two items appear as identical in the schema tree, CREATE scripts for them may be different. Because of this, the UI logic has been changed to always keep two distinct "Script CREATE from ..." commands.
  • In SQL Server versions prior to SQL2005, objects like tables and views were 'owned' by a user, group or role. In SQL2005, such objects belong to a specific named schema instead, and normally the owner of the schema also owns all objects inside the schema. However, it is still possible to have a separate owner for an object (using "ALTER AUTHORIZATION..." SQL statement). Before this version, the Diff didn't detect such explicit authorizations for system objects, so it couldn't resolve all dependencies when dropping a USER having owned objects. This is done now.
  • A user has reported that the SQL server sometimes glitches when several different constraints are all added in the same ALTER TABLE... statement, whereas the same sequences of changes in separate batches works just fine. To solve the problem, a new option "[x] Don't group changes in ALTER TABLE..." has been added to Options/Scripting/Table. It is initially turned off, not to change the usual Diff behaviour, but if you check it, the Diff will issue separate statements for each column or constraint being added to the table.

Bug fixes

  • When making a CREATE script (not a synchro script) for filegroups, the Diff used to script the [PRIMARY] group as ALTER DATABASE ... ADD FILEGROUP, which was an error (as the PRIMARY filegroup is always created with the database). This version never scripts [PRIMARY], and it only scripts ADD FILE if there are additional files in the PRIMARY (skips the first file).
  • "Can't focus on a disabled window" error on the connection panel: when both databases are on the same server, the connection parameters are not complete and you try to choose a database name on the right-side panel, the Diff shows a message box ("Connection parameters not complete"), then tries to set focus to where it thinks you should enter the missing parameters. However, it didn't realize that both DBs were controlled from the left-side panel and so tried to focus on a disabled field in the right-hand box, causing the error. Fixed.
  • When the Diff synchronized a table by re-creating it and copying the original data, it incorrectly includes TIMESTAMPs into the list of copied columns. The server does not allow to change TIMESTAMP columns, so this version leaves them alone.
  • The Diff didn't correctly script various situations with a UDT having a global DEFAULT or RULE bound to it, and then overriden or un-bound for a particular column with this UDT. Such changes are correctly scripted now.
  • The Diff would compare a USER against an APPLICATION ROLE with the same name, causing an assertion error (because users and app. roles are internally represented by objects of different classes and the Diff is not supposed to compare such). In this version, the Diff would never associate USERs, ROLEs and APPLICATION ROLEs with each other, even if they have identical names. This might not be a perfect solution, but it doesn't look like it might cause any new problems or inconsistencies.
  • Must resolve name conflicts btw USER/APPROLE/ROLE, which are all in one namespace, but might not be associated with each other (e.g. if the script creates an app role, user with the same name must be dropped first). Done.
  • The Diff didn't correctly script changes between a 'pure' SCHEMA and an old-style USER+SCHEMA combination (with the same name). Fixed.
  • In DataDiff reporting: after editing / saving a report template, the Diff shows "Duplicate name" error if you try to run the new report. Fixed.
  • The connection panel didn't resize well under some non-standard screen resolutions (comboboxes overlapping). The problem haven't been reproduced here, but some changes in this version should prevent this from happening.
  • Constraint syntax "DEFAULT (expr) FOR (column)" is valid for ALTER TABLE, but not for CREATE TABLE. The Diff knows that and, accordingly, doesn't allow the "At table level" setting for DEFAULT constraints (in Options/Scripting/Tables/Constraints). However, if such option was set by manipulating INI file or registry, the Diff didn't pay attention and would generate invalid code. Fixed.
 

09-Oct-2006AdeptSQL Diff 1.95 Beta 78

Some more corrections - see below.

Quick links:

Bug fixes

  • Under certain conditions, when scripting the entire database, FK were scripted twice. Fixed.
  • The Diff would sometimes attempt to script a multiple-column FK as a column constraint. Fixed.
  • When reading schema from SQL2000, with loading restricted to a particular owner, the Diff would break on user-defined types. Fixed.
  • Values of extended properties and names of some objects were loaded without taking into account the selected code page. As the result, national characters there were loaded incorrectly or replaced by '?'. Fixed.
  • The code page selected in "Tools/Choose encoding" wasn't always saved on exit. Fixed.

Changes

  • Generating "sp_addtype" in SQL2000, the Diff always added the owner name as the 4-th parameter. This is not an error, but it is usually redundant, since most UDTs are owned by DBO anyway. This version only scripts the owner parameter when it is actually needed.
  • The Diff has ways to check if any prerequisite objects are missing from the script. Then it inserts that "Might need to be edited" comment into the script. However, it did so even when preparing a script for side-by-side comparison, where no dependencies need to be resolved and such comments were only distracting. The dependency-checking logic is now bypassed for the "visual" scripts.
  • The SQL editor window now has a status bar indicating the line/column numbers of the cursor position. It also has a "maximize" button on the caption.
 

09-Oct-2006AdeptSQL Diff 1.95 Beta 77

This version fixes an "access violation" exception reading databases, it also improves the way the "EXEC AS ..." clause for procedures and other code objects is handled.

Quick links: EXEC AS ..., [public] was not loaded, Prerequisites are scripted for ALTER ..., "EXEC AS" dependencies, "Owner mapping" for "create user", XProps extended

Changes and improvements

  • Improvements in handling the "EXEC AS ..." clause: where the previous version just used the textual data extracted from procedure body (self/caller/owner/'user_name'), this version actually keeps a link to the corresponding "user" object. This ensures that the Diff now correctly handles "exec as ..." referring to renamed users, understands that "exec as 'dbo'" can be equivalent to "exec as self", ignores 'exec as caller' and so on.
  • The ability to compare "EXEC AS..." clauses literally remains as an option controlled from "Options/Script/Procedures", although it is not quite clear anybody would need it. By default the option is OFF, so the Diff does the "smart" comparison as described above.

Bug fixes

  • Fixed an occasional AV exception filling the schema tree (after loading from the databases).
  • The fixed role [public] was not loaded. Accordingly, any permissions assigned to that role couldn't be compared and scripted. Fixed.
  • Prerequisites are scripted for ALTER ...: When you select a particular object in the schema tree and script it, the Diff makes sure to script any prerequisite objects first. E.g. to script a table [User1].[MyTable], it checks if [User1] should be scripted first. This feature, however, didn't work when ALTER'ing procedures and other code objects. E.g. before scripting "ALTER PROC P WITH EXEC AS 'User1' ...", the Diff should have make sure that [User1] exists in target database or has been already scripted. The new version handles this situation correctly.
  • "EXEC AS" dependencies: When you have a procedure with "EXEC AS user_name" clause, that user can't be dropped without removing the reference from the procedure first. This version of Diff tracks this dependency.
  • "Owner mapping" for "create user": The owner mapping didn't work when the users in question were created without their implicit schemas (i.e. by "create user" rather than by "sp_adduser"). Fixed.
  • XProps extended: SQL2005 allows to attach axtended properties to a wider variety of objects then SQL2000. Some of these new XProps were not properly compared and scripted. This version additionally supports XProps on named schemas, file groups and individual files.
 

04-Oct-2006AdeptSQL Diff 1.95 Beta 75

This update contains several corrections in handling USERs.

Quick links: Assertion error comparing SQL users, Login names, WITH EXECUTE AS

Bug fixes

  • Assertion error comparing SQL users: Comparing users produced an assertion error when a user with the same name was defined as SQL Server login in one DB and as Windows login in the other. Fixed.
  • Login names were not loaded for users created from Windows users or groups. Fixed.
  • Outdated "sp_adduser/sp_dropuser" calls have been replaced by "sp_grantdbaccess/sp_revokedbaccess".
  • The "... WITH EXECUTE AS ..." clauses for procedures and other code objects was not loaded from the database. Fixed.
 

02-Oct-2006AdeptSQL Diff 1.95 Beta 74

This update contains some minor corrections and changes, especially in the way things are scripted for the side-by-side view, reducing the number of visible minor differences.

Quick links: database names in the side-by-side view, separator comments, users / roles, ignored auto stats

Additions and changes

  • This version has an option not to script database names in the side-by-side view. Very often, the two compared databases have different names and there is no need to synchronize these names. However, any "alter database" or "sp_dboption" includes a particular database name and thus shows up as a difference in the side-by-side view. To reduce the number of such diffferences, the Diff now shows "<database_name>" placeholder instead of the actual database names. This new feature only affects the SQL shown in the side-by-side view, but not any "real" scripts nor changes shown in the schema tree. It can be turned off from the "Options/Scripting/Schema level" options page.
  • Some changes ahve been made in the way the separator comments are scripted in the side-by-side view (see comments to B73 for more details).
  • A number of minor improvements has been made in the way users / roles are compared and synchronized.
  • Removed an an unused setting "use sp_dboption vs. alter schema" in "Options/Scripting/Schema level".

Bug fixes

  • STATISTICS automatically created by the server need not be loaded and compared. The previous version correctly ignored auto stats on SQL2005, but loaded them from SQL 2000 (possibly causing a lot of false differences). This version does filter out automatic statistics on both SQL2000 and SQL2005.
  • One useful option recently introduced in the Diff is not to synchronize users/roles from the schema level. However, in SQL2005, each user is granted a CONNECT permission (on the schema level) and those permissions did get compared regardless of the "Ignore users" setting, resulting in false (and unsynchronizable) differences on the schema level. Fixed.
 

29-Sept-2006AdeptSQL Diff 1.95 Beta 73

This update contains a number of important bug fixes.

Quick links: named schemas, Full 'CREATE USER/ROLE' support, Comments improve side-by-side comparison, RECOVERY MODEL

Additions and changes

  • The Diff now displays and synchronizes named schemas in SQL2005. Note that "implicit" schemas (those created automatically by the server when calling "sp_adduser") are normally not shown as a separate entity. The Diff now understands the difference between "exec sp_adduser" (which remains in SQL2005 for backward compatibility and creates both a user and its implicit schema) and the new "CREATE USER" syntax, which only creates a user but not a schema. The Diff can script using either syntax, depending on what is required. It can also synchronize old style and new style users by adding or dropping the associated schema.
  • Full 'CREATE USER/ROLE' support in SQL2005. The Diff recognizes users created from CERTIFICATEs or ASYMMETRIC KEY, users with or without login, WITH DEFAULT_SCHEMA, as well as AUTHORIZATION clause for roles. Note that the Diff now loads names of CERTIFICATEs or ASYMMETRIC KEYs used with the users, it still does not keep these objects as part of its schema model and this is not expected to happen before version 2.0.
  • When the built-in users/roles (dbo, guest, etc) are scripted for the side-by-side view, the Diff now includes a comment saying that the SQL will not be generated in the actual script. When you try to script these users/roles, the Diff would display a warning and ignore them.
  • Comments improve side-by-side comparison: When SQL representations of two tables are compared side-by-side, one of the tables might have, for example, a lot of indexes, whereas for the other one constraints or extended properties migh be scripted on the same line numbers. The side-by-side comparison algorithm is strictly textual and knows nothing about SQL, so it can easily get confused and "match the unmatchable". To avoid this, the Diff now inserts into the side-by-side scripts special marker comments which would help to synchronize the side-by-side view.
  • There was that obscure "LineWeights" page in the "Side-by-Side Options" dialog. The option page has been removed, instead a list of "line weights" suitable for SQL comparison is now stored in a configuration file "asqldiff.lws" distributed with the program (you can find more details inside that text file). Specifically, line weights are defined for each of the comments mentioned above.
  • Added support for the RECOVERY MODEL database property.

Bug fixes

  • There was a combination of errors reading schema with system tables: the Diff could not process columns for system tables. It then tried to report the error, but failed to synchronize between the reader thread and the GUI thread, ended up with a "window device context" exception. This version fixes both of these problems.
  • When you make the Diff to scan a single database and then script a table, the Diff sees there is no database on the other side, and stupidly tries to add a [PRIMARY] filegroup first. Fixed.
 

20-Sept-2006AdeptSQL Diff 1.95 Beta 72

This update contains a number of important bug fixes.

Quick links:

Bug fixes

  • Fixed an "assertion failure in AltContext.pas" when a change involved re-creating dependent views.
  • Scripting a global DEFAULT or RULE with an extra-long (>4Kb) expression might produce a buffer overrun and an AV. Fixed.
  • When dropping column, any STATISTICS dependent on it are also dropped. However, the Diff tried to re-create that STATISTICS, although their column already their column already wasn't there. Fixed.
  • A hidden TEXTIMAGE_ON difference: If a table originally had contained a TEXT or other BLOB column, then the column was removed, the server does not remove the associated filegroup record. If the matched table in the other database is identical, but never contained a text column, the Diff would report a (false) difference in the TEXTIMAGE_ON filegroup. This version doesn't consider it a difference when a [PRIMARY] filegroup in one table is compared against a NULL filegroup in the other one.
  • The new SQL2005-specific syntax for users and roles, introduced in the last update, has been temporary disabled again. Apparently, SQL2005 handles the old-style 'sp_adduser/sp_dropuser' differently than the new 'create user/drop user': the old form automatically creates or drops a 'default schema' for the user, the new form creates/drops only the user, but not the schema. E.g. it is impossible to use 'drop user' on a user created with 'sp_adduser', as the associated schema must be explicitly dropped first. Some more thinking, coding and testing is necessary to re-enable this new feature.
 

19-Sept-2006AdeptSQL Diff 1.95 Beta 71

Some critical corrections in reading/scripting SQL2005-specific permission types, alternative SQL2005 syntax for scripting users/roles, other minor corrections.

Quick links:

Additions and changes

  • Now if the "target" database is SQL2005, then users, roles and application roles are be scripted using new "CREATE/DROP USER/ROLE/APP.ROLE" syntax instead of the old "exec sp_adduser...", etc. procedure calls.

Bug fixes

  • Database-level and object-level permissions new in SQL2005 have been tested and several critical issues fixed (including an "Invalid typecast" exception when reading permissions attached to users or roles).
  • GRANT/DENY in SQL2005 requires any securable entities other than 'sysobjects' to be prefixed with that '::' qualifier (e.g. "TYPE::MyInt"). The previous version didn't do that, B71 does.
  • SQL2005 does not accept "REVOKE ALL" for some entities, requiring an explicit list of permissions to be revoked. The new version does build such a list.
 

15-Sept-2006AdeptSQL Diff 1.95 Beta 70

Improvements in comparing STATISTICS, permissions, users. Fixed an AV loading the schema and several minor issues remaining from the B69.

Quick links: STATISTICS on SQL2005, option page for STATISTICS, Ignore/Retain/Compare for extended properties, comparison and scripting of 'role membership'

Additions and changes

  • STATISTICS on SQL2005: STATISTICS now implemented on all supported versions of MS SQL Server (7.0, 2000, 2005).
  • Added a new option page for STATISTICS. They can be totally ignored, loaded but not synchronized (retained as they were, re-creating them when necessary) or compared like other objects. An additional option allows to ignore STATISTICS names and compare them based on their column lists only.
  • NOTE that the default behaviour for the Diff is now to load STATISTICS (so that it will know to DROP-script them, whenever it is necessary to sync columns) but not to sync them. If you need the STATISTICS to actually be synchronized, change the comparison mode in the new option page described above.
  • The logic of Ignore/Retain/Compare for extended properties is now fully implemented and tested.
  • Added comparison and scripting of 'role membership' for users and other security accounts.

Bug fixes

  • Fixed that AV on loading schema (the one with "TSchCollection.NormalizeName" in the stack trace).
  • At some point around Build 65, the Diff lost the ability to refresh views and functions when tables they depend upon are changed. This functionality has been restored in this version.
  • In the window caption and in the popup hint of DataDiff, the program displays names of the two tables being compared, including, as necessary, server and database names to make it clear which table is where. In some situations, however, the difference was not obvious and the caption could look confusing. In this version, the logic has been changed to ensure that (a) if the compared databases are on two different servers, the caption will always show that and (b) if table or database names are only differ in capitalization, the Diff will find some other part of the name to make them look distinct.
 

14-Sept-2006AdeptSQL Diff 1.95 Beta 69

This version has improved support for permissions, implements "statistics" objects and fixes a number of bugs reported by the users. This is still an interim update, with more changes to come soon.

Quick links: Permissions, STATISTICS, false differences in PKs, UDT-with-default, ALTER TRIGGER

Additions and changes

  • Permissions:Comparison of object-level and database-level permissions has been rewritten. The Diff now recognizes all new types of permissions introduced in SQL2005 on database level, and object-level permissions for all 'securable' objects it currently support (including types, users, procedures, etc.) and not just tables as it was before).
  • The option to ignore/retain/synchronize permissions is now fully implemented. There is also a new option to 'optimize' permissions, which means the Diff would ignore any redundant permissions both on comparison and when scripting. Currently the detected redundancies include: (a) granting/denying on column level what is already granted/denied on object level, (b) granting a particular kind of access (e.g. SELECT) when it is already implied (e.g. by granted CONTROL).
  • The Diff now supports (loads, compares and scripts) the STATISTICS objects in SQL 2000 and SQL 7.0. They are still not supported in SQL2005, though.

Bug fixes

  • The previous version sometimes showed apparently identical PK and UNIQUE constraints as different. These false differences in PKs were likely to be due to different default 'fill factor' settings on the two servers, which would make its way into the indexes underlying the constraints. It was properly filtered out for regular indexes, but showed up in the constraints. This version fixes this particular 'fill factor' issue, but whether it completely eliminates the false differences in PKs remains to be seen.
  • An access violation loading the schema was reported by several users but could not be reproduced here. It might have something to do with loading of permissions, in which case it is probably fixed in this version.
  • Various situations involving a global DEFAULT or RULE bound to a column via a user defined type were not correctly scripted. E.g. altering an existing column to a UDT-with-default does not automatically bind the default, whereas for a new column it does. There are other similar complications as well. About 10 such situations are now added to the test set and this version of Diff correctly handles them all.
  • Due to some recent changes in Diff's internal schema model, the table name was missing in the ALTER TRIGGER statement. Fixed.
 

30-Aug-2006AdeptSQL Diff 1.95 Beta 68

This version has significant internal changes in the comparison and scripting engine, supports all new features of indexes in SQL2005, greatly improves dependency checking (specifically, in foreign keys) and fixes a number of customer-reported issues.

Quick links: Displaying difference details, FILEGROUPS, Faster schema loading, Ignoring differences, dependency tracking, name conflicts, Smarter comparison, SP checksum matching, XML indexes, non-key columns (the INCLUDE clause), IF [NOT] EXISTS(...)

Additions and changes

  • Displaying difference details: For each compared schema object, the Diff now keeps a detailed bit mask of changes and can display the list of changes in user-readable form. This list pops up as a 'tooltip' while you move the cursor over the schema tree.
  • The same difference details are also shown in the 'Details' column of comparison reports.
  • The Diff now correctly loads, compares and displays FILEGROUPS for tables and indexes, in both SQL2000 and SQL2005. Note that this feature is controlled by the "[x] Ignore filegroups" checkbox on the "Comparison/Ignored details" option page, so if you need the filegroups, make sure the checkbox is cleared. NOTE: the "ON partition(column)" syntax of SQL2005 is not supported yet!
  • Faster schema loading: The schema loading has been optimized in terms of both complexity of the queries (less JOINs now) and the amount of metadata transferred from the server.
  • The option in "Selective loading" which controlled whether or not tables should be checked for the presence of data has been removed. The Diff now uses a much more efficient way to obtain record counts for all loaded tables, so it always gets them. It is still possible to script as if all tables had data, but the option is now a checkbox in "Scripting/Tables".
  • Ignoring differences. Usually, if there is a change in some schema object (so that it shows black in the schema tree and get synchronized), it propagates all the way up to the schema level. Now the Diff has a mechanism to isolate/ignore certain changes. For example, if you tell it not to script users with the schema (see "Options/Scripting/Schema level"), you will still see the changes under the Users node, but those changes wouldn't be scripted from the schema level and, provided that there are no changes in other objects, the root node will appear unchanged.
  • The dependency tracking has been improved. In particular, scripting of FOREIGN KEYs is now properly deferred until all required items are scripted first. Several other 'tricky' dependency situations have been resolved as well:
  • Computed columns must be removed (and later re-created) before changing data columns they depend upon. The Diff now detects such dependencies and correctly scripts them.
  • Consider a situation when a view X in the target database prevents adding table X from the source database. Such conflicts may occur between any two top-level entities or between PK/UQ constraints and indexes in the same table. The Diff now correctly resolves these name conflicts, removing or renaming the conflicting object.
  • Smarter comparison for indexes and constraints: the Diff now uses more complex rules to tell whether two indexes are 'equivalent' and should be paired in the schema tree. For example, primary XML indexes for for same column are always equivalent, regardless of their names. In other situations, identical lists of key columns and identical UNIQUE/CLUSTERED attributes are taken into account.
  • SP checksum matching: There is now an option (in "Options/Comparison/Code Comparison")to consider code objects (procs, views, functions and triggers) equivalent if they have identical bodies, even though their names don't match.
  • XML indexes were ignored by previous versions of Diff. They are fully supported now, including loading, comparison and scripting (SQL Server 2005).
  • Added support for non-key columns (the INCLUDE clause) in indexes (SQL Server 2005).
  • An option to script an "IF [NOT] EXISTS(...)" conditional statement before DROP/CREATE has existed in the Diff for some time (see Options/Scripting/Tables), but it only affected scripting of CREATE TABLE. Now this conditional logic works for most DROP statements (for all sysobjects, indexes and UDTs) and for CREATE statements, whereever SQL Server permits it (that is, for tables, constraints, global rules and defaults, UDTs and indexes).

Bugs fixed

  • All new and changed functionality has been tested on MS SQL 7.0, 2000 and 2005. A number of incompatibilities have been found and fixed for MS SQL 7.0
  • In previous versions, DataDiff incorrectly treated rows like (1,NULL,2) and (1,2,NULL) (same sequence of non-null values, but in different columns) as identical, because the fast checksum-based comparison didn't take the NULLs into account. This is fixed now.
  • Synchronizing columns with COLLATE clause, the Diff would sometimes place COLLATE inside the CONVERT() call, which is not a valid syntax. The right thing is to script such conversions as "CONVERT(...) COLLATE ...", which is how the Diff does it now.
  • The Diff now doesn't script BEGIN TRAN/COMMIT if there would be only one SQL statement wrapped inside the transaction.
  • There was a well hidden error that caused the schema tree to become un-sorted in some updates. The problem had seemed to be fixed, but then appeared again. Now it has been fixed for good.
 

23-July-2006AdeptSQL Diff 1.90 Beta 66

This version is an interim update with just a couple of minor corrections concerning comparison of comments and scripting of indexes. More changes are on the way.

Quick links: ignoring comments, DROP INDEX/CREATE INDEX twice

Bug fixes

  • Fixed the problem with ignoring comments in procedures, etc. Even with "[x] Ignore comments" option set, the Diff sometimes marked a difference if a comment was present in one procedure, but not in another.
  • Syncronizing an index, the Diff scripted DROP INDEX/CREATE INDEX twice. Fixed.
  • The DataDiff now ignores TIMESTAMP columns by default, it also won't script them in INSERTs even if they are compared.

Pending changes (for the next update)

  • Full support for XML indexes and non-key index columns (the INCLUDE() clause) in SQL2005.
  • Support of partitioning syntax ("ON partition_schema(column)") for tables and indexes in SQL2005.
  • More precise control over permission scripting should be added, including the options to either synchronize permissions or to re-create the original permissions when an object is re-created. The same should be done for extended properties.
 

03-July-2006AdeptSQL Diff 1.90 Beta 65

This update has dramatically improved script generation. The time since the last update has been spent developing a set of automated tests for Diff's comparison and scripting engine. Each of the tests creates two fresh databases on a specified server, fills them with some slightly different schema objects and then lets the Diff try to compare and synchonize them. The test set currently checks over 250 various situations and the Diff correctly handles all of them, both for SQL2000 and SQL2005 (as opposite to over 80 tests from the same test set failing in the last publushed Beta).

The Diff still remains in Beta for the only reason that no tests has yet been done for scripting of statement-level and object-level permissions.

Quick links: Improved table scripting, Better dependency tracking, Numbered procedures, Delimited names in sp_rename, Recreating the only column in a table, extended properties, user-defined types (UDTs), NOT FOR REPLICATION attribute, Exrta-large expressions, global DEFAULTs and RULEs, Resolving name conflicts, Mapping owner names, scripting DB properties

Changes and improvements

  • Redesigned the options controlling name comparison for constraints. There used to be two separate settings "Ignore constraint names" and "Script automatic constraint names", with some of the combinations confusing or even mutually exclusive. Now it has become one setting with three "levels" of constraint name comparison and scripting (All ignored/only named/all compared).
  • The schema tree now displays additional details for some of the objects: types for columns, values for extended properties, etc.

Bug fixes

  • Improved table scripting: Many corrections are done in the ways the Diff synchronizes table columns of different types, with or without data, with or without re-creating the particular columns or the entire table, explicitly converting compatible column data when necessary, providing temporary DEFAULTs for added NOT NULL columns, handling possible data truncation, etc, etc.
  • Better dependency tracking: the Diff now delays scripting of foreign keys until both the refering and the referred tables are defined. In some other situations it also forces "prerequisite" objects to be scripted first, although the dependency resolution is not yet 100% reliable.
  • Numbered procedures: When reading a group of numbered procedures, Diff was one-off associating the procedures with their numbers. Multiple corrections are also made in the way the Diff creates and removes numbered SPs (drops the whole group, then re-creates any SPs remaining in the group).
  • Delimited names in sp_rename: In some situation while temporary renaming a column, the Diff incorrectly used delimited name (like [this column]) in a call to sp_rename, which was wrong: the delimiters would end up as a part of the new name. Fixed.
  • Recreating the only column in a table: When Diff tried to drop and recreate a column, and that column happened to be the only one in the table, ALTER TABLE DROP COLUMN would fail. This is now fixed by temporarily adding (and then removing) a dummy column.
  • A number of corrections has been made in loading, comparing and scripting of extended properties. Now they work correctly for all schema objects in SQL2000 and for all supported schema objects in SQL2005.
  • A number of scenarios involving changes in user-defined types (UDTs) have been tested and appropriate adjustments made in the scripting engine. Now the Diff correctly supports situations when a change in a UDT also involves changes in dependent columns, when a column changes from a UDT to a native type and back, in a table with or without data, etc.
  • Various situations have been tested involving either synchronizing the NOT FOR REPLICATION attribute (for IDENTITY columns, for triggers and for constraints) or retaining it while synchronizing other changes in these objects (if the "Ignore NFR" option is set). A number of corrections have been made.
  • There are certain column attributes (IDENTITY, ROWGUIDCOL and TIMESTAMP) that the server only allows for a single column in a table. When moving any of these attributes "upward" from one column to another, the attribute should be first removed from the original column. The Diff now takes care of that.
  • Exrta-large expressions: The Diff didn't expect any expressions (e.g. in a computed column) to be longer than 4K (the size fitting into a single [syscomments] record). However, such long expressions are possible (e.g. with a long binary literal or with a long CASE...) and they would cause error loading the schema. Fixed.
  • A number of corrections is done in reading, comparing and scripting global DEFAULTs and RULEs and their bindings to specific columns and types. Among other things, the Diff now recognizes equivalence between bound RULEs and regular CHECK constraints, as well as between bound global and in-table DEFAULTs. An option has been added to ignore the way these constraints are implemented (in-table or bound) as long as the actual check expression or default value are identical.
  • Resolving name conflicts: The Diff didn't correctly track situations where each of the two databases uses the same name for a different kind of objects, e.g. RecentCustomers can be a table in one DB and a view in another. Trying to sync leads to a name conflict: e.g. the view has to be dropped before the table can be added! This version of Diff is aware of this situation and drops the conflicting objects when necessary.
  • Mapping owner names: It has been possible for some time to specify "owner mapping" in the Diff and thus compare [X].[object1] in one database against [Y].[object1] in the other (where X and Y are owner names). However, this implies that the Diff should have used owner names from the target database (that is, "Y" is this example) whenever it needs to modify or add schema objects. In previous versions, this was not done consistently for all kinds of generated scripts. Fixed.
  • Some corrections scripting DB properties: (a) they were scripted with the wrong database name (the source, rather than the target) and (b) Database properties can not be scripted inside a transaction. Now the Diff commits an open transaction, if any, before scripting the properties.

Known problems

  • Comparison and scripting of schema permissions (both object-level and statement-level) still needs some work. Right now, the Diff allows the choice between not loading permissions at all (and thus losing permissions whenever any objects in the target database are recreated) and loading, comparing and scripting them, which is likely to either fail (if there is no such user in the target database) or produce undesirable results (permissions dropped or created according to those in the source DB). It seems that the typical situation is to have different sets of users and permissions on a test DB and on a production one. Accordingly, the default mode should be to load all the permissions, ignore them in the comparison, then re-create them as they were whenever an object in the target database is re-created.
 

23-May-2006AdeptSQL Diff 1.90 Beta 64

Added Export/Copy feature in DataDiff (see below), some corrections in script generation and DataDiff.

Quick links:

Changes and improvements

  • DataDiff column-level scripting options have been redesigned to be easier to use and less ambiguous: arranged into "Left" and "Right" groups as they were, it wasn't clear which group of options takes effect when synchronizing from left to right or the other way round. Also the "Automatic" scripting mode (default) has been added, which means the Diff is free to choose the best scripting mode for that column and does not get stuck in the chosen mode when conditions change (e.g. when the column status is switched between 'compared' and 'ignored').
  • DataDiff: Whitespace changes in column values were not visible in the data grid. This version allows to display spaces as dots. Note that this option (in "Schema Options/Data comparison/General") is initially disabled, so yo won't see ths new feature unless you turn it on.
  • Preference settings (in "Data comparison/Large data") have been added to control the types of columns server-side scripting is preferred for.

Bug fixes

  • There can be a situation when compared foreign keys refer to the tables which are matched to each other but have different names (e.g. "references dbo.my_table(x)" vs. "references user1.my_table(x)", where owner names [dbo] and [user1] are equivalent according to the "Owner mapping"). The previous versions of Diff would not recognize these FKs as identical and would try to synchronize them. This is fixed now.
  • In the DataDiff data grid, when you sort it by one of the (numeric) columns, NULL values in this column not only don't get sorted correctly, but also disrupt ordering of the neighbouring rows. Fixed: now NULL is always considered smaller than any non-null value (even 0 or empty string).
  • The 'trim trailing spaces' column comparison option in DataDiff didn't work. Fixed.

Feature requests

  • The code to re-arrange the order of scripted objects according to dependencies between them in still under construction.
  • Need a dialog displaying the list of additional objects to script as dependencies, a stored option to control the default behaviour (re-arrange Y/N, extra objects Y/N/Confirm)
  • The Diff should be able to delay scripting of FKs whose target table is not yet defined. This might be needed even for re-arranged tables in case of circular dependencies.
 

3-May-2006AdeptSQL Diff 1.90 Beta 62

Added Export/Copy feature in DataDiff (see below), some corrections in script generation and DataDiff.

Quick links:

Changes and improvements

  • Table data compared in the DataDiff viewer can now be saved into a file or copied into clipboard in one of two major formats: as HTML tables or as MS Excel XML spreadsheets. In both formats, the color highlighting and text styles for changed/unchanged columns are properly preserved. This new functionality of DataDiff is fully Unicode-enabled (the data in exported files is saved in UTF8).
  • When you specified upper/lowercase conversion for SQL keywords (in Options/Script/Formatting), the setting also affected predefined data types such as INT or CHAR. However, data type names in MS SQL are identifiers rather than reserved keyword, so strictly speaking that was incorrect. This version allows to set the case conversions separately for keywords, identifiers and known data types (see the Script/Formatting option page). Note that user-defined types are handled as identifiers anyway, because the formatting code uses a fixed lookup table (with type names like 'INT', 'VARCHAR', etc).

Bug fixes

  • In DataDiff: you could specify the digest threshold for BLOB values of upto 64KB, but if you actually set it above 32KB, you could get an assertion failure. Fixed: DataDiff now consistently uses 64KB as the limit.
  • Scripting: when (a) a column type changes, and (b) the column has a default on both sides, and (c) the value of this default also changes, the Diff would drop the default before altering the column, then try to re-create this default twice. Fixed.
  • In the recent versions the code comparison in comment-insensitive mode didn't properly skip comments: although it ignored text inside the comments, it detected a difference when a comment didn't occur in the same position in both texts. Fixed.
 

28-Apr-2006AdeptSQL Diff 1.90 Beta 61

This update includes several important corrections in script generation and reporting.

Quick links: Scripting, Reporting, The connection panel

Changes and improvements

  • The "owner mapping" configuration is now saved with project options rather than global options. This way you can have different owner maps for different comparisons, which is obviously how it should be. Note: the change means that the owner mapping will not be automatically saved when you leave the Diff, but only when you save the comparison into a .ASQ file.
  • Normally the Diff only sees a change in constraint names as a difference when at least one constraint in the pair has a non-default name. When names on both sides are generated by the server, they are ignored both in comparison and in scripting. However, there is an option which controls whether or not to script automatic constraint names ("[x] Hide automatic names" at Options/Scripting/Tables). Before this version, the option only controlled scripting, not comparison. It seemed logical to make this option to affect comparison as well. So now if you un-check "Hide automatic names", the Diff will also synchronize them.
  • When you used the "Produce SQL/DROP" command on a selected object, the Diff didn't script the removal of any dependent objects, therefore in many situations the DROPs could not be executed without manually finding and scripting DROPs for the dependent objects as well. This version does remove dependencies before dropping the selected object(s). You can still produce DROP statements just for selected objects, hold the SHIFT key while clicking the scripting commands.
  • The "Produce SQL/DROP" and "...CREATE" commands cleared all script from the SQL code window before placing there the generated SQL. Although not exactly a bug, this was inconsistent with the way difference scripts were generated (by adding to existing SQL in the editor window). In this version, all kinds of SQL (DROP/CREATE or difference) are always added to the end of the existing script. If you need to clear the editor window, do it manually before scripting.
  • It turned out that in some situations the server scan might receive several (identical) responses from the same machine. As the result, the server scan dialog would show duplicates of the same machine node (with any SQL servers working on that machine also duplicated). Now the server scan filters out any duplicate responses, which guarantees that servers in the tree will be unique.
  • The list of SQL Server errors to ignore during script execution (in MSSQLIgnoredErrors.cfg) has been updated, several new "harmless" error codes added. [This file lists server errors which are actually warnings and don't prevent the server from successfully finishing the statement. Those are situations like creating of a stored procedure referring to undefined objects (but the SP is still created) or creating a table with the total VARCHAR size potentially exceeding the row size limit (but that is still a valid table), etc].

Bug fixes

  • Scripting. FKs referring to a table being re-created were dropped, but not re-created. Fixed.
  • The "Ignore owners" option didn't work corectly. Fixed.
  • Due to an error in Beta59, dependent foreign keys were not dropped and recreated when re-creating a primary key or a UNIQUE constraint. Fixed.
  • When a column is dropped, the Diff also attempts to drop any extended properties for that column, which is incorrect as the server automatically drops xprops together with their parent object. Fixed.
  • Reporting. After generating both schema- and data- reports in the same session, a second (duplicate) set of export formats appeared in the report viewer's Export menu. Fixed.
  • The schema reports displayed empty database names in the caption. Fixed.
  • Commands to the "Export to..." menu on the report preview form sometimes would just stop working (you click "export to..." and nothing happens, no errors, nothing!). Fixed.
  • The "Status" and "Compare type" column in the "Dataset column layout" section of the DataDiff report were not filled correctly (remained empty). Fixed.
  • The connection panel. Yet another round of corrections in the server selection combobox should finally get rid of the problem with duplicated server names. Server aliases now keep their names when moved into the MRU part of the server list.
  • Fixed the weird mousewheel scrolling in the server combobox.
  • On the connection page, the Diff didn't enable the comparison button when the only difference between the two connections is in IP port numbers (i.e. two databases with the same name on different instances of SQL server running on the same machine).
 

14-Apr-2006AdeptSQL Diff 1.90 Beta 59

This update includes some minor corrections. This is a 'release candidate': as soon as there are no new bug reports coming for one week, Diff 1.90 will be officially released.

Quick links:

Bug fixes

  • When comparing code objects (procedures, etc) with "[x] Lexical comparison" enabled but '[ ] Ignore comments' disabled, the Diff didn't process comments properly. As the result, any single quote (') in the comment was interpreted as beginning a string literal, which, if unbalanced, could easily span to the end of the procedure. Since the Diff always compares string literals exactly, this would lead to unexpected changes reported in procedures differing only in white-space formatting, which would be otherwise found identical. Fixed: the comparison algorithm now recognizes comments and does a kind of semi-lexical comparison within them, ignoring white space but comparing anything else as plain text.
  • If one of the triggers is disabled, the difference must show up as "ALTER TABLE DISABLE TRIGGER" statement in the side-by-side view after the CREATE TRIGGER. Done.
  • In Options/Data Comparisons/Scripting, when you click in the "Batch every N rows" input field, select the entire input text and then type a number, you'd get " '' is not a valid integer value." message box. Fixed.
  • When the SQL Server is configured to return error messages in non-Latin character sets, the message texts were displayed in the Diff as question marks. Fixed.
 

11-Apr-2006AdeptSQL Diff 1.90 Beta 58

Changes and improvements

  • The pulldown list of recently used filter expressions in DataDiff row configuration dialog has been changed from table-specific to global, so that previously entered filter expressions can be reused with different comparisons. The selected/entered filter expression, of course, remains table-specific.

Bug fixes

  • Unlike SQL2000, SQL2005 allowes (under certain conditions) to define constraints PK or UNIQUE on computed columns. The Diff wasn't aware of that and so didn't script column-level constraints with computed columns. Fixed.
  • In the "ALTER TABLE ... ENABLE/DISABLE TRIGGER..." statement the Diff scripted the trigger name in [owner].[name] format, which was incorrect: in this context both SQL2000 and SQL2005 require the trigger name only. Fixed.
  • The Diff did not handle correctly duplicate foreign keys. For example, if you happen to have in one table foreign keys [fk1] and [fk2] with identical definitions, and the same 2 FKs in the opposite table, both [FK1] and [FK2] in the left-hand table would be be incorrectly associated with the same [FK1] on the right-hand side. Fixed.
  • The Diff was ignoring the 'snap-to-default-button' Windows interface option (the one which causes the cursor to be automatically positioned over the [OK] or other default button on a modal dialog). This has been fixed, except for single-button [OK] message boxes.
  • Issues running/stopping SQL: The button in the SQL editor that was supposed to stop running script didn't work. If you tried to close the window while the script was running, this caused an AV exception. Fixed.
  • After breaking script execution, the Diff didn't show the 'execution pointer' at the next SQL statement to be executed. Fixed.
  • Refreshing after running a script: When the Diff executes any SQL in the editor window, it asks if the [possibly] affected schema should be refreshed. If you say No, it should reset the change flag and not bother you again. Instead, the Diff then keeps asking about refreshing the schema every time you try to close an SQL view. Fixed.
  • After executing a script generated by DataDiff, the program asked to refresh the schema (and did so), whereas in fact it should have asked to refresh the data comparison. Fixed.
  • Persistency in DataDiff parameters: In data compare, the "Don't keep identical records in memory" and the "Order data on the server..." were persisted differently, although logically they both are table-specific settings. Fixed: now they both are saved with table-specific DataDiff configuration. Besides, when you compare several tables one after another (and it is the first data comparison for this pair of tables), the DataDiff initially uses these settings from the previous comparison.
  • The MRU logic in the server selection combobox didn't work correctly: you would end up with a lot of identical items in the list. Fixed: Beta 58 removes duplicate server names saved by the previous version and tries not to make duplicates again.
  • The auto-completion feature in the server selection combobox sometimes worked incorrectly, replacing the entire server name you've typed in. This had to be fixed by disabling the auto-completion.
 

5-Apr-2006AdeptSQL Diff 1.90 Beta 57

Changes and improvements

  • Until now, the Diff would not allow to run multiple instances of itself. This was done so for historical reasons, but the limitation doesn't make much sense any more. So now you can run several instances of Diff if you like, with a separate comparison in each of them. Just note that any changes in the program configuration (Schem Options, window layout, etc) are saved when the Diff is closing, so the last instance you close overwrites any previous settings.
  • There is also a new command line parameter '/last' or '/l', which emulates (and improves) the original single-instance behaviour: if another instance of Diff is already running, the new instance passes to it its command-line parameters, activates the original instance and exits. If the original instance sees a comparison file (.ASQ) passed to it, it opens the comparison.
  • Keeping the tree position: Suppose you select an object (e.g. a table) in the schema tree, then run some SQL that removes or renames that object, then refresh the tree. The Diff can no longer find the previously selected object in the tree, so it collapses its parent node. Although not exactly an error, this is inconvenient. The correct response would be to keep the list open and select an object at approximately the same position within the list. Done.

Bug fixes

  • Reported 'Invalid typecast' exception in some situations while loading table constraints. Fixed.
  • With "[x] Always script owner names" option, Diff 1.90 scripts owner names for column types as well. This is valid in SQL2005, but not in SQL2000. Fixed: column types are now only scripted with schema names for SQL2005.
  • Comparison of column names in indexes was always case-sensitive, regardless of the actual case-sensitivity settings. Fixed.
  • When you specified an "owner mapping" on the Comparison/Names option page, the Diff uppercased the owner names. However, in combination with case-sensitive name comparison it means that the mapping wouldn't work properly. Fixed: the names specified for the owner mapping are now kept exactly as entered.
  • When you configure to script constraints with columns (in Scripting/Tables), and a column name is bracketed (e.g. [Last name]), the Diff fails to associate any constraints with such column and so doesn't script the constraints at all. Fixed.
  • Uppercasing in the side-by-side view: With comparison case-sensitivity turned ON (in Comparison/Code) and keyword formatting set to lowercase/uppercase (in Scripting/Formatting), we have a confusing situation: differences like 'PROCEDURE' vs. 'procedure' show up in the schema tree, but aren't visible in the side-by-side view, since it shows both sides already upper-/lower- cased. Although not exactly a bug, this is inconsistent and confusing, so a new option has been added in this version: "[x] Don't change case in side-by-side view", just below the case-controls in Scripting/Formatting. You can still have nice formatting for the output script, but will see things as they are in the side-by-side view.
  • The side-by-side view didn't correctly display a national character with code 255. This was reported by a Russian customer for whom the Diff couldn't show the small Cyrillic letter 'ya'. Fixed.
  • Comparison not saved: When you start the Diff and there are connection parameters remaining from the previous session and then you try to save the comparison into a file, it will not be saved correctly unless you touch some of the connection parameters. The same error leads to the SaveAs command being disabled after saving a comparison: the Diff should disable SaveAs only when there is no connection parameters to be saved, but it confused 'no parameters' with 'parameters not changed'. Fixed.
  • Incorrect resizing: When Diff's main window is just small enough to fit the connection panel and you start a comparison, the main window automatically resizes itself to fit the schema tree, however the sizes of the status bar and the toolbar are not adjusted accordingly unless you manually resize a bit more. Fixed.
  • The "File/Close all scripts" menu command, once clicked, not only closes all open SQL windows, but also stop the SQL viewer from appearing until you refresh the comparison. The same command remains enabled even when there are no editor windows to close. Fixed.
  • Message panel at startup: When the Diff starts, the message panel at the bottom is visible, although it should not be shown until a comparison is open and there are some messages to display. Fixed.
  • Missing PKs: When you making an update script for several selected table and there are PRIMARY KEY constraints in several of the tables, the Diff only script those constraints from the first of the selected tables, but fails to do so for the rest of them. Fixed.
 

3-Apr-2006AdeptSQL Diff 1.90 Beta 56

Fixed an error in side-by-side comparison, finalized server selection combobox. No more changes/improvements are planned for version 1.90. As soon as there no new bug reports coming for 10 days in a row, Diff 1.90 will be officially released. Before that time, we will keep updating the program as necessary.

Quick links: Help file finalized, "Division by zero"

Changes and improvements

  • The pull-down server list in the connection panel has been redesigned: it now visually separated in two parts: the upper one works as a MRU list, remembering servers recently selected or typed in manually, the lower one lists servers known by their aliases, etc.
  • Help file finalized: The help file has been context-linked to the relevant windows and dialogs of the program, especially to individual pages of the schema options dialog.

Bug fixes

  • There was a "Division by zero" when you tried to compare side-by-side a long (~200 lines or more) procedure on one side against no code on the other. Fixed.
 

30-Mar-2006AdeptSQL Diff 1.90 Beta 55

Fixed a logical error in data comparison, finalized a few outstanding issues.

Quick links: DataDiff error, Scripting direction reversed, enabled/disabled triggers, Help file finalized

Bug fixes

  • A DataDiff error: A logical error in the data comparison algorithm caused AV exceptions when comparing tables with "don't keep identical rows" option and some columns excluded from comparison. Fixed.
  • Scripting direction reversed: In one of the recent updates, difference scripting for the entire schema got reversed: the Diff would generate DROPs instead of CREATEs and vice versa. That only happened when you selected the root schema node, any sub-nodes like tables or procedures were scripted correctly. Fixed: the scripting direction is now restored back to normal.
  • Incorrect script for synchronizing enabled/disabled triggers: the table name was missing in "ALTER TABLE ??? ENABLE TRIGGER ...". Fixed.
  • The column configuration dialog in DataDiff did not recognize columns as belonging to the PK (and therefore doesn't automatically set them as key columns) for column names enclosed into the [...] or "...". Fixed.
  • The new exception handler has been finally configured to show up only for critical exceptions such as access violations. Exceptions that can happen as a part of normal work (e.g. pulling down the database list with bad login parameters) the application handles as usually by showing an error message box.

Changes and improvements

  • Help file finalized: The help file has been context-linked to the relevant windows and dialogs of the program, especially to individual pages of the schema options dialog.
 

29-Mar-2006AdeptSQL Diff 1.90 Beta 54

The extended exception reporting, added in the last Beta, helped to find several AV exceptions still remaining in the Diff. This update is a quick fix for these exceptions. Several known issues (rather minor) still remain, so expect another update soon.

Quick links: updated help file, access violation, Selective loading

Changes and improvements

Bug fixes

  • Fixed an access violation comparing renamed columns.
  • There was an access violation in DataDiff, when it is run on a pair of tables that contain no differences, with the options to not retain identical records. The DataDiff shows a blank data diff screen, followed by the exception. Fixed.
  • There was Access violation scripting a column with user-defined type and a global default or a rule bound to this UDT. Fixed.
  • Option "Ignore changes in expressions / [x] in CHECK constraints" only works for named CHECK constraints. This is not actually a bug, since unnamed CHECK constraints can only be associated with each other if they have identical expressions. This issue has been addressed by documenting it in the options dialog: "[x] In CHECK constraints (only for named ones)". Nothing else could or should be done about it.
  • Selective loading for a specific owner was broken in the last Beta: all objects were loaded regardless of what owner filter was set. Fixed.
  • When the owner filter is set so that no objects are loaded, there is an access violation while loading the schema. Fixed.
  • DataDiff running in the "discard identical records" mode did not show in the status bar the number of identical (discarded) rows. Instead, it incorrectly displayed 0 identical rows (as none are kept in memory). Fixed.
 

27-Mar-2006AdeptSQL Diff 1.90 Beta 53

Hopefully one of the last, if not the last Beta updates before the official release of 1.90.

Quick links: Option pages restructured, Automatic case-sensitivity option, 'Hide changed objects', extended exception reporting, 100% of CPU time, MS SQL 7.0 compatibility restored:, Non-latin object names

New and changed features

  • Option pages restructured: "Ignored schema details" has been split into "Schema Scan/Selective loading" (options which affect loading) and "Comparison/Other ignored details" (things which get loaded but aren't compared)
  • A new block of options for ignoring changes in expressions (in computed columns / DEFAULTs / CHECKs) has been added to the "Other ignored details" page, to work around the problem with SQL2005 re-formatting these expressions (the problem being that when you compare equivalent databases between SQL2000 and SQL2005, you can get a lot of "false positives" from the re-formatted expressions).
  • A new option added into the "Schema Scan/Selective loading" page: a checkbox indicating whether or not the Diff should obtain counters for various kinds of schema objects it is going to read. Pre-loading the counters allows to display realistic progress indicators, but obviously the query itself adds some time to the schema scan. This option does not affect the resulting schema.
  • The "Schema Scan/Ownership" page has been removed, options from it moved to several other pages: (a) the filter-by-owner settings has been moved into the new "Selective loading" page; (b) The scripting-related settings page moved to "Scripting/Identifiers"; (c) the owner mapping has been moved into the new "Compare/Name comparisons" page.
  • The "Comparison/Renaming support" page has been removed, as the options it contained are not supported in this version.
  • Automatic case-sensitivity option: The case-sensitivity option for object names has been moved into the new "Compare/Name comparisons" page and extended to include 3 values: case sensitive, insensitive and "Automatic", where the case sensitivity is determined according to the collation order of the comparison databases (name comparison is only case sensitive when both databases use case-sensitive collation order). This new setting is now the default.
  • A new menu item 'Hide changed objects' has been added to the schema view filters. Now if you need to view left-only and right-only schema items, but not the changed one, you can do so.
  • The Beta now uses an extended exception reporting component (from www.madshi.net), so if any AV happens, you will be able to send me a detailed bug report by just pressing a button.
  • The provider name in the connection strings has changed from "SQLOLEDB.1" to "SQLOLEDB". Normally both work just the same, but presumably in some rare situations using the version specific provider name can cause the "Provider cannot be found" error message.

Bug fixes

  • Incorrectly implemented monitoring of the multi-threaded schema loading sometimes caused the Diff to occupy 100% of CPU time, slowing down all other applications (as well as the schema scan itself). This only happened when one of the loader threads completed ahead of the other one, e.g. when comparing a local database with a database on a remote server. Fixed.
  • The same problem as described above occured in the DataDiff data scan. It is also fixed.
  • MS SQL 7.0 compatibility restored: Some of the recent dependency-scan additions were not compatible with MS SQL 7.0. This version fixes the problem with an axe: it just doesn't read dependencies for SQL 7.0. A better solution may be possible in one of the next updates.
  • A bug in the server scan dialog prevented some nodes of the server tree from being added to the list of recent servers. Fixed.
  • The Diff still associated procedures and other code objects in SQL 2005 with their owner (user), rather than their named schema. The same problem existed for the user-defined types. Fixed.
  • The user-defined types were always scripted without their schema name, which is an error if the type was defined outside the current schema. Fixed: the format of UDT names is not controlled by the same options as other objects (see "Scripting/Identifiers" option page)
  • Non-latin object names caused errors during the "checking for data" phase of the schema loading. With the data check disabled, such objects were loaded, but their names weren't correctly displayed in the schema tree. Both problems have been fixed in this version, although you must make sure to set the correct encoding (Tools/Encoding...) before running the comparison. Note that the Diff still doesn't support several different character sets in the same comparison.
  • When reading database schema with filtering by owner (or rather, schema name), the Diff generated some queries that work for SQL 2000, but return an error in SQL 2005. Fixed.
 

17-Mar-2006AdeptSQL Diff 1.90 Beta 51

Hopefully one of the last, if not the last Beta updates before the official release of 1.90.

Quick links:

New and changed features

  • In SQL2005, the Server Management Studio stores database diagrams in the [dbo].[sysdiagrams] table and adds a number of stored procedures to manipulate the diagrams, also as a part of the [dbo] schema. They are essentially system objects, but they are not marked as such so the Diff would loade them as part of the schema. This version uses the 'microsoft_database_tools_support' extended property which Microsoft tools kindly attach to such objects in order to filter them out.
  • Added an option to ignore any differences in constraint names, as long as the constraints are equivalent. See the "[ ] Ignore name changes..." checkbox on the Options/Scripting/Tables page of the options dialog.

Bug fixes

  • When system tables are included in the scan, trying to detect data in some of them (e.g. [sys].[sysrowsetcolumns]) results in the server reporting an error. Fixed: now system tables aren't scanned for data, even if the others are. The Diff assumes that system tables always contain some data.
  • SQL Editor options (such as colors of syntax highlighting) were not loaded correctly when the Diff starts, which means it was impossible to make persistent changes to the syntax highlighting. Fixed.
 

15-Mar-2006AdeptSQL Diff 1.90 Beta 50

Quick fix: there was a 'stack overflow' trying to script a table with self-dependencies (see details below).

Quick links:

Bug fixes

  • When a table uses a function in a computed column and this function refers back to the table, the new dependency-checking algorithm (used since Beta48) goes recursive and crashes the Diff with a "stack overflow" message. Fixed.
  • After a table is re-created to synchronize column order, the Diff reloads just the target schema and somehow the difference flag in the columns collection node remains set. So although all differences are gone, the Diff still displays the collection as changed (another refresh does clear it). Fixed.
 

13-Mar-2006AdeptSQL Diff 1.90 Beta 49

Important improvements in schema scan and in DataDiff to handle very large tables, various minor corrections.

Quick links:

Changes and improvements

  • One of the [optional] steps in loading database schema is checking if each of the tables has data in it. For schema scripting it is only necessary to know whether or not there are data rows, not the exact number of them. However, before this version, the Diff did use COUNT(*) to obtain the row counts, which would considerably slow it down when the tables are large. Now the option (in "Ignored details" option page) has been extended to include 3 positions: no row check at all (assume all tables have data), actually count the rows (using SELECT COUNT(*)...) and the new option to quickly check for presence of data (using SELECT TOP 1...). This new option is now the default one, it provides all necessary information and it is fast regardless of the table sizes.
  • There are two options in the Diff controlling the "SET QUOTED_IDENTIFIER" settings. One is "[x] Generate QI" checkbox which affects BOTH comparison and scripting, so if you un-check it, the changes in QI will not be hightlighted in the schema tree. The other is "(o)Always/( )When needed" switch which determines whether the SET QI should be scripted always or only when the object actually contains any quote character. This one, however, only affected scripting, but not comparison, which was always done on the "when needed" basis. This was rather inconsistent, so in this version the "Always/When needed" switch has been extended to control comparison as well. It means that if you set it to "Always", ALL procedures (triggers, views, functions) with different QI settings will be marked as changed, even if they don't have any quotes inside.
  • The code which checks whether the "SET QUOTED_IDENTIFIER" setting is relevant for the procedure (view, etc) simply looked for any quote character anywhere in the procedure body. It could return false positives if the quote character was in a comment. Although it didn't actually cause any trouble (except for maybe an extra "SET QI" scripted sometimes), it was was replaced by a smarter code, which properly ignores quotes in comments or single-quote string literals.
  • This one is not really a bug, but a situation in DataDiff which can be confusing: when you compare very large tables, and specify "[x] Order data on server by key columns" and the key column is not indexed, it is likely to cause a timeout while waiting for SQL Server to sort the data. A note informing about such situation has been added below the "[x] Order data" checkbox.
  • The DataDiff progress dialog has been extended to include important statistics such as the number of processed rows, the number of buffered rows and the total amount of memory allocated to keep them.

Bug fixes

  • When DataDiff started scanning the data, the queries were issued in such a way that there was a delay, proportional to the table size, before the first record could be fetched. For extra-large tables (> 1M records) that would result in a timeout and a blank DataDiff window. Fixed: now the retrieval of data starts immediately ('SET NOCOUNT ON', forward-only server-side cursor).
  • The "Checking for data" phase of the schema scan did not display itself in the progress dialog. Fixed.
  • When you try to close the Diff, then answer [Yes] when it offers to save the comparison, the press [Cancel] in the "Save As..." dialog, the application closes instead of returning to where you were. Fixed: now cancelling the "Save As..." dialog as well as any errors while saving the comparison return you to the main Diff window.
  • A tooltip in the Schema Options dialog under Scripting/Formatting/Keywords says "not implemented". In fact the option does work. Fixed (the tooltip removed).
  • Beta48 has somehow revealed an old bug comparing indexes, which is that an index existing in the right-hand DB but not in the left-hand one would be marked as changed, but the change was not propagated to the table level. Fixed.
  • While DataDiff was loading data from tables, it did not immediately react to the user clicking the [Cancel] button. Fixed.
 

06-Mar-2006AdeptSQL Diff 1.90 Beta 48

Further corrections in the script generation, memory clean-up.

Quick links: Smart comparison for expressions, multi-level dependencies, table re-creation sequence, column order in the hint popup

Changes

  • The SQL2005 modifies CHECK and DEFAULT expressions, re-formatting each numeric literal and adding parenthesis around them. As the result, comparing equivalent expressions between SQL2000 and SQL2005 returns a mismatch which can never be synchronized. This version adds a "[x] Smart comparison for expressions" option on the "Comparison/Text and name comparison" option page. When the smart comparison is enabled, the Diff ignores (a) parenthesis around the numbers (unless it's a function call), (b) optional prefix '$' for money columns and (c) compares the numeric literals as numbers (so e.g. '0.01' and '1.0E-2' would be considered equal).
  • The Diff now correctly handles multi-level dependencies between schema-bound views and functions, dropping and re-creating all such objects throughout the whole dependency chain.
  • The table re-creation sequence has been changed so that triggers and constraints (or at least triggers) be scripted after inserting the data, so the triggers won't fire on that INSERT.
  • When the column order was different and the Diff configured to detect changes in the column order, it marked the the entire table as changed, but not the 'Columns' node. So it was not obvious what the change actually was. This version does mark the 'Columns' collection node as changed and reports the change of column order in the hint popup.
  • The 'SET QUOTED_IDENTIFIER' and 'SET ANSI_NULLS' settings (before procedures, views, etc.) are now scripted in the same batch, just to make the script a bit more compact.

Bug fixes

  • The system stored procedures which manipulate users, logins and groups (sp_dropuser, sp_grantdbaccess, etc) can't be executed in a transaction. The Diff now understands this and scripts such statements outside the transaction.
  • Finished checking for memory leaks, some more of those have been found and fixed.
  • When re-creating a table, the Diff would drop constraints to avoid name conflicts. However, the previous version would drop all constraints but not FKs. Fixed.
  • When a table was being recreated, the Diff scripted permissions and xprops twice. Fixed.
 

01-Mar-2006AdeptSQL Diff 1.90 Beta 47

Further corrections in the script generation.

Quick links:

Bug fixes

  • The Diff didn't check if there are FKs dependent on an index being dropped. Such dependencies must be checked and the FKs dropped, if necessary. Done.
  • If the left-hand table has its clustered index on some column A and the right-hand table has its clustered index on column B, the Diff must drop the existing clustered index before it can create a different one. Fixed.
  • Bug in B46: when dependent constraints are being dropped, the Diff scripts each of them twice. Fixed.
  • Bug in B46: When synchronizing a named constraint with unnamed one, the Diff would first script renaming (which is all that was needed), then try to add the constraint as a new one. Fixed.
  • Cleaned up some non-critical memory leaks (in configuration parameters).
 

28-Feb-2006AdeptSQL Diff 1.90 Beta 46

Some more changes / corrections in script generation.

Quick links:

Changes

  • Optimized "SET QUOTED_IDENTS" and "ANSI_NULLS": if you enable generation of these settings before stored procedures, functions, views and triggers, the Diff used to put them before each of the generated objects. This version scripts them once at the beginning and then only when a setting changes.
  • DataDiff: It might be a good idea to retrieve data sorted by the key column. This is not strictly required for the comparison algorithm to work, but this way (a) you immediately get the data correctly sorted in the grid and (b) with the "Discard identical rows" option enabled, you are making sure that identical rows will be loaded more or less simultaneously from both tables and therefore the program will be able to discard them as excepted. So this version include a new option in the DataDiff row configuration page to sort the incoming data.
  • The logic of The "Recreate tables" option has changed. When enabled, the option used to mean that the Diff must re-create table if there are any changes to any columns and as a side effect it enabled order-sensitive column comparison. Now the option has been re-phrased as "Keep column order, re-create table is necessary". It no longer forces the Diff to re-create a table if the synchronization can be done without that, but the Diff will do whatever necessary to synchronize the column order. The option is now enabled by default.

Bug fixes

  • When a column with some constrains is recreated, and constraints of this type are configured to be scripted with column (e.g. 'x int unique'), the Diff would drop the PK, drop the column, recreate the column with constraint, then tried to add the same constraint again, which was an error. This is fixed now.
  • When the Diff has to drop a PK or UNIQUE constraint in order to change it or its column(s), it would also drop any FKs depending on this constraint's index. When restoring the PK/UNIQUE constraint, it would forget to restore the FK as well. Fixed.
  • To preserve data, the Diff scripts "change via copy" SQL sequence when a column has to be re-created and there is data in the table. As it turned out, it does so also for computed columns, which is an error, because data can't be copied into a computed column and such columns should have been simply added/dropped. This version adds the logic to recognize when the data should or should not be preserved when re-creating columns.
  • The Diff didn't detect changes in constraint name as a difference to be synchronized, unless both constrains were named. Ignoring names is OK for 2 "unnamed" (automatically named) constraints, but not correct if at least one of the names is explicitly specified. This version correctly synchronizes constraint names and, if it's the only change, does so using 'sp_rename' without actually re-creating the constraint.
  • When the scema scan starts, the first status text in the progress dialog should be "Connecting to...", for each of the two databases. However, the Diff displayed it for the left-hand DB, but not for the right-hand one. Fixed.
  • DataDiff: there was a problem loading data from NTEXT/NCHAR columns. Fixed.
  • With the "Lexical comparison" (for SP, etc) option turned on, the Diff would incorrectly parse and compare string literals. E.g. two strings '; hello' and ' hello'" would be seen as identical. Fixed.
  • The 'Discard unchanged rows' option is DataDiff doesn't work if the rows contain any column(s) with data conversion (e.g. 'int' vs. 'float'). Fixed.
 

17-Feb-2006AdeptSQL Diff 1.90 Beta 45

Another bunch of corrections, including important improvements in SQL scripting and in DataDiff.

Quick links:

Changes

  • To avoid timeout errors when a complex database is scanned, it may be necessary to increase the timeout value for queries (not to be confused with the connection timeout). Such setting did exist in the Diff, but it was hidden on an unrelated option page ('Executing scripts/General'). This is obviously a connection-specific setting, so it is now added to the connection panel and removed from the options dialog.
  • When a saved comparison is loaded, the Diff now recognizes when the two DBs are happen to be on the same server and automatically sets "(o) On the same server" mode.
  • DataDiff column configuration: the pull-down part of the filter combobox, containing the recently used expressions, is now saved not in the registry (common for all DataDiff comparisons), but with the settings for this particular table comparison.
  • Fixed-size string columns (e.g. 'NCHAR(30)') were loaded with all their trailing spaces, which prevented them from comparing correctly. That is, DataDiff would see any string value in a CHAR(5) column as different from the identical string value in a CHAR(8) column. Now the DataDiff can optionally RTRIM() string columns before fetching them from the server. This option is automatically turned on for CHAR and NCHAR columns, but not for VARCHAR/NVARCHAR (because trailing spaces in VARCHARs are probably needed). However, you can override this setting for any string column in the column configuration dialog.
  • One recent addition to DataDiff column configuration, the 'Insert mode' option, was specified as one setting for both compared columns. However, it turned out to be more consistent to use separate setting for each direction (that is, depending on whether you update left-hand or right-hand table, the column value may need to be scripted differently). The column configuration dialog has been changed accordingly.

Bug fixes

  • Constraint generation is broken in Beta44: When constraints are restored, the Diff now misses the whole 'alter table... add' part! Fixed.
  • The SQL editor window used to keep the CPU 100% busy just doing some idle-loop checks repeatedly. Not so much a bug as an annoyance, but now it is fixed, anyway. Now the windows in Diff are very quiet CPU-wise, unless you are actually doing something with them.
  • When DataDiff scripted a DECIMAL column, it used system locale settings. If the locale used comma as a decimal separator, the scripted numbers would also have commas inside, which is not valid in SQL. This version always produces valid decimal literals.
  • Decimals with different number of decimal places didn't compare correctly (e.g. the DataDiff would see 1.0000 and 1.00 as different values). This happened because DataDiff tends to use fast binary comparison whereever possible, especially for numeric columns. However, for equivalent DECIMALs the binary representation depends on the number of decimal places, so binary comparison can not always be used. Fixed.
  • Hopefully nobody uses that, but SQL Server does allow to include square brackets or quote chanracters into "quoted" object names, like "t[1]". For this to work, the closing brackets must be escaped by doubling them, e.g. 'CREATE TABLE [t[1]]] (...)'. The Diff didn't do the escaping correctly, which would cause scan errors if such objects existed in the databases. Fixed.
  • When a session starts with connection having Windows authentication, the login/password fields were not disabled until you switch to SQL login and back to Windows authentication. Fixed.
  • After the fix in Beta40 which disables permission scripting for users missing in the target DB, the Diff also stopped scripting permissions in some other situations when they should have been scripted. Fixed.
  • The "Hide identical rows" filter in DataDiff didn't work when some of the columns had different data type (e.g. 'int' against 'float'), even if their values in a particular row are equivalent or not. Fixed.
  • 'Timestamp' columns in DataDiff must have 'Exclude from inserts' setting as the only one possible for them. Done.
  • DataDiff display filters ('Hide unchanged', etc) must not affect the view when a single table is being viewed in DataDiff. As it was, the filters remaining after the last comparison could hide the viewed table completely, whereas the 'set filters' button on the toolbar is disabled. Fixed.
  • When viewing a single table in DataDiff, the column configuration dialog incorrectly forced all columns to be 'ignored for inserts', so no INSERTS were scripted. Fixed.
  • Due to an error reading comparison files, DataDiff configurations for specific tables were not re-loaded with the comparison. Fixed.
  • Several corrections have been made in the code allowing to specify separate row filter expressions in DataDiff.
  • In some situations DataDiff's column configuration dialog assigned to columns default scripting modes which aren't even enabled for them. The logic of assigning default descripting modes and other column-wise DataDiff option has been reviewed and corrected in many places.

Known issues

  • When a column with some constrains is recreated, and constraints of this type are configured to be scripted with column (e.g. 'x int unique'), the Diff drops the PK, drops the column, recreates the column with constraint, then tries to add the same constraint again, which is an error.
  • The 'Discard unchanged rows' option is DataDiff doesn't work if the rows contain any column(s) with data conversion (e.g. 'int' vs. 'float').
 

16-Feb-2006AdeptSQL Diff 1.90 Beta 44

This update fixes a DataDiff bug introduced in Beta42 and a potential "access violation" when reading schema dependencies from the database.

Quick links: DataDiff broken, AV reading dependencies, enabled/disabled constraints

Bug fixes

  • DataDiff broken: Recent changes in Beta42 changed format of the connection string being passed to DataDiff when a data comparison starts. As the result, DataDiff was unable to connect to the databases. Fixed.
  • AV reading dependencies: Sometimes during the 'Reading dependencies' phase of the scan the Diff would show 'Access violation' warning in the message panel and skip the rest of the schema loading (database properties, extended properties, permissions). Fixed.
  • Some DEFAULT constaints belonging to system tables ended up in the schema tree as global defaults (that is, those created by 'CREATE DEFAULT...'), which is an error. Fixed.
  • There are several corrections scripting enabled/disabled constraints: (a) When the Diff generated a script to add a disabled ('WITH NOCHECK') constraint to the table, it missed the 'WITH NOCHECK' clause. (b) Besides, simply adding a constraint WITH NOCHECK is not sufficient for it to be disabled, ALTER TABLE NOCHECK is required as well. (c) When synchronizing enabled vs. disabled constraints with automatic names, the Diff inserted the wrong name (that is, in the script for right-hand DB it used constraint name from left-hand DB). All these errors have been fixed.
 

15-Feb-2006AdeptSQL Diff 1.90 Beta 42

Multithreaded schema loading, improved connection panel, various small corrections, especially in setting and storing of several schema options.

Quick links: server selection combobox, server aliases, server scan dialog, parallel schema loading, new progress dialog, internal changes, "Difference hints/Long items hints"

New and changed features

  • Server names in the server selection combobox look just like before, but 'behind the scenes' the Diff now keeps a partial connection string for each of them, not just the server name. So once you select a server from the combobox, this can also automatically set netlib, IP, login or timeout, depending on which information is available for this particular pull-down item (from the server scan dialog, or from server aliases in the registry, etc).
  • To fill the servers combobox, the Diff now uses the list of 'server aliases', as specified by the MS Client Network Utility, in addition to other sources it used before.
  • The server scan dialog has been modified to allow you to choose connections with a specific network library. You can now double-click not only on a 'server' node in the scanned tree, but on its netlib-specific subnodes as well. Supported are 'TCP/IP' and 'named pipe' subnodes.
  • The two database schemas are now loaded by two parallel threads, which can result in significantly shorter loading times. The actual effect of this parallel schema loading will depend on where your servers are: loading from two different remote servers may be almost twice as fast now, whereas for the local server the gain won't be that significant.
  • Accordingly, the Diff now uses a new progress dialog during the schema scan. The dialog has two separate progress indicators for each of the databases being compared.
  • There have been serious internal changes in the Diff to allow the multithreading described above. One other side effect of these changes is that the Diff now handles aborted or failed comparison in a more reliable way: if the new comparison fails, the current comparison remains intact. The Diff will no longer show the one-sided schema view if one of the connections fails.
  • When you change any options in the "Schema Options" dialog, and these changes affect how the schema tree should look, the Diff immediately repaints or rebuild the schema tree, as necessary. If complete schema rescan is required, the Diff first asks if you want to reload the schema now. In previous versions, changes in the settings would not be reflected in the schema view until you manually refresh it.
  • The option controlling case-sensitivity of name comparison has been moved from "Schema Scan/Ignored Details" to "Comparison/Textual and name comparison".

Bug fixes

  • When you run SQL script in the editor window, and there is a transaction, and the server encounter a SQL error inside the script, the editor would fail to reset its internal "in transaction" flag. When this happens, the editor window can never be closed, because it asks to end the transaction which no longer exists on the server. This has been fixed: the editor now correctly resets its internal flags when a transaction is rolled back by an error.
  • The "Difference hints/Long items hints" option on the "Display/Schema Tree" option page didn't work. It is fixed now.
  • On the options page "Schema Scan/Ownership", the "Retrieve all/Owned by" and the "Ignore owner names" options were not correctly loaded on startup, so every time you run the Diff, they would be reset to the defaults. Fixed.
 

05-Feb-2006AdeptSQL Diff 1.90 Beta 41

This update fixes several problems reported by the users. More changes are on the way, but putting them into the same update would have delayed it unnecessary, so only the bug fixes have been included here.

Quick links:

Bug fixes

  • The SQL generator would sometimes forget to put the table name in ALTER TABLE ... ADD CONSTRAINT [foreign key]... Fixed.
  • When a NOT NULL column is added to a table which already has data, the Diff scripts this by first adding the column as a nullable one, then updating it to some default value (like 0), then ALTERing to NOT NULL. However, it tried to use the same sequence for a TIMESTAMP column, which is initialized internally and should be simply added. Fixed.
  • Schema reporting command caused access violation if called when you have only one database loaded (not a comparison). Fixed.
  • When a report is about to be generated for a single database, the "[x] Report only changed items" checkbox doesn't make any sense. So in this version, it is disabled when reporting a single DB.

Minor changes

  • Now the SQL editor blocks the switching of target DBs while in transaction.

Known issues

  • There is an AV lurking somewhere in the DataDiff report dialog. I saw it once but so far has been unable to reproduce.
  • Both schems and data reporting for a single database actually need separate report templates. Using comparison statistics and color highlighting in this case doesn't seem to make such sense.
 

29-Jan-2006AdeptSQL Diff 1.90 Beta 40

Finalized SQL2005 compatibility for procedures, functions and triggers. Important improvements in code generation, various bug fixes.

Quick links: "WITH EXEC[UTE] AS ...", "Script users" option, trigger comparison, re-creates permissions, Permissions for missing users, NFR for triggers, mousewheel scrolling, Detecting BEGIN TRANS, Error in column order, Some options not saved

New and changed features

  • The Diff now correctly processes "WITH EXEC[UTE] AS ..." option for SQL2005 procedures, triggers and functions, as well as "RETURNS NULL ON NULL INPUT" / "CALLED ON NULL INPUT" option for functions. Since the new "EXTERNAL NAME ..." clause in procedures and functions is compared as part of the body text, it does not require any special handling in the Diff. This means the Diff now fully supports procedures, functions and triggers in SQL2005.
  • If you try to close an SQL Edit window while there is an open transaction, the Diff will show you a warning message box and won't close the window unless you either commit or rollback the transaction.
  • A new "Script users" option is added on the "Scripting/Schema level" option page. This way you can tell the Diff not to script users (groups, roles) when synchronizing the entire databases (from the root of the schema tree). It appears that more often than not you will have different sets of users in the source and the target databases, so this option is initially turned off (that is, not to script users). Regardless of the setting, you can still script users if you select some of them (or the entire category) in the schema tree.

Bug fixes

  • The trigger comparison logic has been disrupted in Beta 39, so the Diff detects changes in triggers but can't synchronize them. This is fixed now.
  • After an object is synchronized by re-creating it, none of its permissions were re-created. This applied to procedures, functions, triggers and views. Now the Diff re-creates permissions, after re-creating the object itself, as they were in the target database. If you really need to synchronize the permissions, you will have to apply the re-creation script, refresh the schema and synchronize again. This is obviously not a perfect solution, but at least you won't have permissions on the target server suddenly dropped.
  • Permissions for missing users: When scripting differences in permissions and some of the users (to whom those permissions are granted) are defined only in one database, the Diff did not take this into account and generated GRANT/DENY/REVOKE statements for those missing users as well. This version corrects this: permissions are synchronized only for users which exist in both databases.
  • NFR for triggers: Trigger comparison now takes into account the 'Ignore Not For Replication' option. Since 'NOT FOR REPLICATION' is specified as a part of trigger body, it took some changes in Diff's built-in SQL parser to make it ignore the NFR clause during the text comparison. NOTE: if you wish the NFR ignored for triggers, you must also enable "Lexical comparison" on the "Comparison/SQL Textual..." option page. The Diff now prompts you to do so.
  • The SQL editor did not recognize mousewheel scrolling. The mousewheel works now.
  • Detecting BEGIN TRANS: The SQL editor is supposed to detect when a transaction begins or ends from the SQL script (e.g. after executing BEGIN TRANS, as opposite to just clicking the "Begin trans" button), but that didn't work in previous versions. Fixed.
  • Error in column order: In some rare situations, after repeatedly adding and removing columns from a table (e.g. using MS Enterprise Manager), the Diff would read the columns in a wrong order. Fixed.
  • Some options not saved: The flags controlling textual comparison for procedures/triggers/views/functions, such as case-sensitivity or lexical comparison, were not properly saved on exit and therefore would revert to default settings on the next run. Fixed.

Known issues

  • When you choose a different server in the connection panel and there is a database name already selected (for the previous server), the Diff does not attempt to verify that the database name is valid for the new server as well. Though not a bug, this creates an opportunity to make mistakes configuring your server connections, so something is going to be done about this.
  • When you run a comparison with the left-hand DB incorrectly specified, the Diff reports an error connecting to the left-side DB, but then proceeds reading the right-hand one. When it is done, the tree view remains empty. The correct behaviour would be to stop the comparison if either of the databases is not available and revert to the "no comparison" display.
  • When you are synchronizing a user type definition, and this user-defined type is used by some columns in the target database, the columns are not converted to the new type definition, but instead reverted to their original physical type. This is not exactly a bug, but the result may be different from what you'd expect. Probably an option should be added to detemine how you'd like to script such situations. Example: suppose you have a type 'MyNumber' in both databases, defined as 'DECIMAL(10,2)' in the left-hand DB and as 'DECIMAL(14,5)' in the right-hand one. After synchronizing this type left-to-right, any columns of type 'MyNumber' will become of type 'DECIMAL(14,5)' (that is, their actual type remains unchanged, but that is no longer a UDT), whereas the desired result is probably that they remain 'MyNumber', but with the physical type changed according to the new definition 'DECIMAL(10,2)'.
 

18-Jan-2006AdeptSQL Diff 1.90 Beta 39

This update contains some important corrections in the way the Diff reads table functions, triggers and elsewhere in the scripting engine.

Quick links: Computed columns in tbale function, SET ANSI_NULLS and SET QUOTED_IDENTs, Triggers didn't compare correctly, enabled and disabled triggers, [x] Ignore Enabled/Disabled, Incorrect table re-creation, always re-creates table functions

Bug fixes

  • Computed columns in tbale function: When you use a table function, and the returned table of this function contains computed columns, SQL Server keeps the column expressions in a way that confuses Diff's schema reader (it says "CREATE statement expected" and occasionaly has an AV). This bug existed in all versions of Diff and is now fixed in 1.90 Beta 39.
  • SET ANSI_NULLS and SET QUOTED_IDENTs setting for table functions were not correctly loaded (they were always OFF in the Diff). This error was a result of SQL2005-compatibility changes in 1.90. Previous versions used an undocumented 'status' field in sysobjects to fetch the settings. This worked fine in SQL2000, but didn't work at all in SQL2005. Earlier builds of 1.90 switched to the 'official' way of getting these settings via OBJECTPROPERTY, which worked fine with SQL2005, but it turned out that in SQL2000 it works for all objects except table functions. So now the Diff uses a combined method which always fetches the correct values for the ANSI_NULLS and QUOTED_IDENT flags.
  • Triggers didn't compare correctly (gave false positives) between SQL2000 and SQL2005 databases. The reason was that on SQL2005 the Diff couldn't get some of the flags for triggers the way it gets them on SQL2000. In this version, the method of loading triggers has been changed to work correctly with both SQL2000 and SQL2005.
  • The Diff didn't recognize enabled and disabled triggers. It does not, including their correct comparison and scripting.
  • A new option '[x] Ignore Enabled/Disabled added to the "Ignored details" page of the schema option dialog. It affects the way triggers and constraints are compared.
  • Incorrect table re-creation: When the Diff tries to modify a table by re-creating it (see the 'Scripting/Tables' option page), it has to drop all named constraints, so their names can be used again in the new table. However, the previous version first renamed the table, then tried to drop constraints using the old table name (already not existing) in ALTER TABLE. This has now been fixed by changing the order of scripting: constraints are dropped first, then the table renamed.
  • The following change addresses what looks like a quirk in MS SQL Server. The server sometimes (?) refuses to ALTER a table function because it considers the function dependent on itself (?). In such situations, a DROP/CREATE sequence must be used instead of ALTER FUNCTION. The Diff can't recognize this situation exactly, so it now always re-creates table functions. Or should this be a separate option?

Known issues

  • Trigger comparison doesn't take into account the 'Ignore Not For Replication' option. As the result, NFR and non-NFR triggers (otherwise identical) are always considered different and scripted.
 

17-Jan-2006AdeptSQL Diff 1.90 Beta 38

Changes in the connection dialog, corrections in saving/loading projects, updated help file.

Quick links: server scan, preferred servers list, network library selection, Help file, error loading comparison

Changes and new features

  • The server scan from the connection panel is restored. It is now implemented as a separate popup dialog where you can see server names being added to the list in real time, as soon as servers on your LAN are responding. You can specify the waiting time or cancel the scan whenever you like.
  • The server scan dialog also allows you to add any of the found servers into the preferred servers list, one which is initially taken from the list of recent servers kept in registry by MSSQL utilities.
  • The connection panel is now extended to include optional network library selection and port selection (for TCP/IP netlib).
  • Help file has been updated and now reflects all recent changes to the program, including the new DataDiff features and changes to the Automation API.

Bug fixes

  • Fixed an error loading comparison files. If a comparison document specified connections to 2 separate servers, the Diff could not recognize that and incorrectly interpreted the DBs as being on the same server.
  • The serial number selection dialog was broken (with assertion failure). This has been fixed now.
  • When a schema scan began, Diff's main window didn't have a chance to repaint itself properly until the connection to server(s) is established. As a result, the Diff would appear frozen or broken for a few seconds. This is fixed now.
  • There is another change in the connection panel: connection timeout set to 0 (as it is by default) should mean "use the default timeout", but in fact it was interpreted as "wait forever", which caused the Diff to freeze if you try to connect to a wrong server. Now unless you specify a positive timeout, the default timeout (usually 15 sec) is used

Known issues and things to do

  • The new features in the connection dialog are not logically complete yet. The server scan dialog can provide netlib and port number as well, but this information currently is not currently passed to the connection panel.
  • The following is not actually a bug, but just another opportunity to make a mistake, a thing that the Diff should check, ideally, but so far doesn't. With the introduction of NetLib selection and port number into the connection panel, you must be aware that the usual form to specify named SQL Server instances ("MachineName\Instance" or ".\Instance" for local servers) won't work with some NetLib selections, specifically with the TCP/IP. Instead, you must specify an IP address or a machine name resolvable to IP, whereas the port number determines the server instance.
  • Incorrect comparison of permissions (false positives) has been reported, but it has not been reproduced yet.
 

12-Jan-2006AdeptSQL Diff 1.90 Beta 37

Further corrections in the DataDiff, additions to Automation interfaces

Quick links: Automation API, Removed [Refresh Servers] button, Scripting INSERTs

Changes and new features

  • Automation API has been extended to allow loading customized option sets from an .INI file and running comparisons from previously saved comparison documents. You can also specify separate filter expressions when running DataDiff comparison programmatically.
  • Removed [Refresh Servers] button from the connection panel. This is logical, as the Diff no longer scans servers. The button will be back as [Scan available servers], once such funcitonality is implemented.

Bug fixes

  • Scripting INSERTs in DataDiff was broken by the previous Beta. This important functionality is restored now.
  • Some minor corrections in the Automation interfaces.
 

08-Jan-2006AdeptSQL Diff 1.90 Beta 36

Serious cleaning-up of new (and previously nonfunctional) DataDiff features and various minor corrections.

Quick links:

Bug fixes

  • All new features in DataDiff are finalized and tested. Now you can compare a column only present in one DB against a constant, specify case-insensitive comparison or numeric tolerance, set scripting modes, etc.
  • Various minor corrections.
 

20-Dec-2005AdeptSQL Diff 1.90 Beta 35

This update changes the way the Diff builds the list of available SQL Servers. This also fixes the nasty freezing problem.

Quick links: list of known servers, connection settings are remembered, SCHEMABINDING dependencies are resolved, freeze, view WITH SCHEMABINDING, No TRANS in side-by-side view, issues from Build33

New features and changes

  • The Diff no longer uses SQLDMO to obtain the list of available servers, using instead the list of known servers the SQL client keeps in Windows registry. This way the Diff doesn't have to spend time pinging the LAN and there is no need to have SQLDMO around. This also happens to solve the "freezing" bug described below

  • Besides keeping connections in saved "comparison documents", the last valid connection settings are remembered as defaults for the next session, as it was before 1.90.
  • For views and table functions with SCHEMABINDING dependencies are resolved correctly. Normally it is possible to change a table without dropping and re-creating views and functions that refer to this table. However, views and funcs which have the WITH SCHEMABINDING clause must be dropped prior changing a table they refer to. So the Diff now does this.

Bug fixes

  • With SQL2005 client installed, the Diff would permanently freeze reading a database (whether SQL2005 or SQL2000 one) if any time before that you happen to pull down the server selection combobox on the connection panel. Apparently SQLDMO somehow messed up messaging or threading within the Diff, so that any subsequent SendMessage call would lock it up. The issue has been solved by removing SQLDMO calls as described above.
  • A view WITH SCHEMABINDING must be dropped and re-created to allow a table to which it refers to be modified. Previous Diff versions ignored this dependency, this version resolves it correctly.
  • No TRANS in side-by-side view: when the transaction scripting is enabled, the BEGIN TRANS... COMMIT code appeared both in the SQL editor (where it is needed) and in the side-by-side view (where it is not). Now the code is not scripted in the side-by-side view.

Known issues

  • All issues from Build33 are still there.
  • The dropped server scan feature is to be restored, eventually, but in a more civilized form: activated from a separate [Locate servers] button, displaying the servers as they are found and allowing to cancel the search any time during the scan
  • The following is related to the schemabinding issue described above and it is not clear whether is a feature or a bug. Suppose you have table T in each database and a schemabound view V in the left-hand one. Suppose there is a change in the table T to be synchronized. We select the table and synchronize from right to left. The update script will drop view V, make changes to the table, but will not re-create the view. From one point of view this is the expected behaviour, because there is no view V in the right-hand DB and by dropping it from the left-hand DB we move towards full synchronization. On the other hand, the view is a separate object and you didn't tell the Diff to synchronize (drop) it, only to sync the table. Your opinion on this would be appreciated.
 

03-Dec-2005AdeptSQL Diff 1.90 Beta 33

Here is the long-awaited Diff update. During the last few months, the program has suffered a bad case of feature creep, so instead of 1.80 Release, this is again a Beta, but with significantly extended functionality. Adding some level of SQL2005-compatibility has also contributed to the delay. Anyway, the new version is finally here: with comparison document support, re-designed configuration storage, lots of new options in the DataDiff and built-in reports.

What's next? Despite the "Beta" mark and a few known issues (see below), this version should be quite usable, more so than the current "stable" 1.70. It doesn't look like it will stabilize at 1.90, though. A lot of new stuff is on the way, such as full Unicode support, new SQL editor, saving schema snapshots, full support for new SQL2005 objects, to name just the major features. So in the near future you can expect a sequence of "unofficial" interim releases where at least some of these new features will appear, then the whole thing will be released as a major new version, AdeptSQL Diff 2.0.

Changes in our upgrade policy. The Diff has existed for 3 year already and so far there has been no license upgrades. This is a long time for a software product, so once Diff 2.0 is released, most of the existing customers will be expected to pay, if they wish to upgrade to the new version. The exact upgrade prices for 2.0 are yet to be defined, but recent customers will be able to pay less or even get the upgrade for free, depending on how long ago they purchased the product.

So here is our free upgrade offer. If you have been considering buying the Diff, but are unsure about its present "Beta" status, please wait no longer: we guarantee the free upgrade to 2.0 for those who will be purchasing the Diff in December 2005 or later. The upgrade will also be free for those people to whom that has been promised individually.

Quick links: comparison projects, XML table columns, MAX length columns, schema names instead of owner names, reporting and exporting, option storage is re-written, command-line parameters, separate row filter expressions, server-to-server synchronization, throw away identical records, various scripting modes, case-sensitivity option, numeric tolerance option, data comparisons are saved, simultaneously load data

New features and changes

  • The Diff now works with "comparison projects", which can be saved and opened later. The program also keeps a list of recent comparisons, so that you can quickly re-compare any of them.

  • Implemented some basic SQL2005 compatibility. A number of changes has been made in the Diff to ensure that it can read a database schema from MS SQL Server 2005 or MS SQLExpress. The Diff does not yet support most of the new SQL2005 features such as XML schemas, .NET integration or the new variants of SQL CREATE syntax. However, if you have a database freshly ported from SQL2000 to SQL2005, you should be able to use the Diff between them just as before. The only new features this version of Diff does support are these:

    • New XML table columns, both typed and un-typed, are recognized, correctly scripted and synchronized. Typed XML columns are scripted with correct XML schema names, but the XML schemas themselves are not kept as separate entities.
    • The new syntax for MAX length columns is recognized for all character types (CHAR|NCHAR|VARCHAR|NVARCHAR(MAX))
    • According to the new rules in SQL2005, the Diff now uses schema names instead of owner names. However, the "schemas" themselves are not kept as separate entities in the schema tree nor are they scripted (that is, no CREATE/ALTER/DROP SCHEMA yet).
  • The reporting and exporting functionality has been added. The Diff now includes a 3rd-party reporting and exporting component, which allows comparison reports to be previewed, printed or saved in any of the following formats: HTML, PDF, RTF, Excel. Comparison reports (although rather basic ones) are implemented for both schema- and data- comparisons. Cloning and limited customization of the provided report templates is technically possible, but is not documented yet.
  • The option storage is re-written to allow keeping all program options either in the Windows registry (as it was before) or in an .INI file. The latter allows the Diff to run in "portable" mode: from a removable media like a flash drive, without installation.
  • You can now start the Diff with some command-line parameters, including a comparison project's name and switches controlling where to take the program options from (registry or a specific INI file) and where to save them back.
  • New DataDiff options caused re-design of the column configuration dialog. Now it has two separate tabs for table-level configuration and for the column-level one. The new DataDiff options include:
    • Option to specify two separate row filter expressions for the two tables;
    • Option to use direct server-to-server synchronization, when the data is passed between the servers or between databases on the same server, as opposite to using the data loaded into the Diff. Therefore, you can synchronize large BLOB data without actually keeping it all in memory (in which case the Diff only needs to keep a 16-byte MD5 digest)
    • Option to throw away identical records and reuse the memory. In this mode only changed rows have to be kept in memory, which means the Diff can now compare tables of practically unlimited size.
    • There are now several comparison styles and various scripting modes that can be changed for individual columns. Comparison styles include case-sensitivity option for character columns and numeric tolerance option for the numeric ones. Scripting modes include "client" (script using loaded values), "server" (script inserts/updates using values directly from the opposite database), "skip" (exclude from the script) and "literal" (to be used for INSERTs when one of the columns is missing).
  • Details of data comparisons are saved with the comparison project. This means that once you compare a pair of tables, all table-level and column-level settings are preserved: filter expression(s), ignored/compared/key columns, scripting specifics for each of the columns, etc.
  • The DataDiff now uses separate threads to simultaneously load data from both tables. For databases situated on different SQL servers such asynchronous operation may result in significantly faster data loading.
  • A new option page "Connection defaults" has been added. There you can specify the server names, logins and connection timeouts you are likely to use for a new comparison. There is also a new option causing the Diff to force certain QUOTED_IDENTIFIERS and ANSI_NULL settings when a connection is being open.

Bug fixes

  • A very serious problem was introduced in the last Beta: in trial mode, even immediately after its installation, the program would display the "Trial has expired" message and demand a key to run. This update not only fixes this problem, but actually resets your trial period.
  • There is a command in the popup menu of the built-in SQL editor which is supposed to launch MS Query Analyzer from the Diff, passing to it the target connection parameters and the selected SQL text to be edited or executed. As it turned out, the menu item was disconnected from the actual code launching MSQA, so the command was doing nothing. The functionality of the command is now restored.
  • Numerous minor corrections throughout the program

Known issues

  • [Corrected in Beta 36] The logic for enabling/disabling column comparison and scripting controls in the new DataDiff column selection dialog is not finalized. It is not always clear what the new scripting modes (client/server/literal/skip) will do in each particular situation.
  • Reporting is not complete. The default schema report is supposed to include some comments detalizing the differences (e.g. for a table it could be like "columns added", "constraints removed", etc). This information is not yet available.
  • None of the new Diff features has been documented in the help file yet.
  • Automation API has not been changed yet. It is supposed to support the new "comparison documents" mechanism. At least it should be possible to open programmatically a previously saved comparison document; ideally the API should give access to individual project-level and general options.
 

23-May-2005AdeptSQL Diff 1.80 Beta 32

This version contains important improvements in the SQL code generation: the Diff can now correctly script various changes which in earlier versions would require manual editing of the script. There is also a number of corrections in other areas. Since the changes made to the program have been rather extensive, this build is considered a BETA, with a production version to follow soon.

Quick links: Recreate tables, recreate dependent views, CREATE if table doesn't exist, new type conversion matrix, default values for each data type, better at resolving dependencies, closes connections, registration dialog is redesigned

New features and changes

  • New "Recreate tables" checkbox on the 'Options/Scripting/Tables' page tells the Diff to re-create tables (instead of altering individual columns) whenever it is necessary to keep the correct column order. If you set this option, the Diff will also consider changes in the column order as signficant, display them in the tree and synchronize them. Regardless of this option, the Diff will re-create a table if there is no other way to script a particular change (e.g. making a column IDENTITY in a table with data)
  • An option to recreate dependent views has been added (also on the Scripting/Tables page): when columns in a table change, it may be necessary to re-submit all dependent views to the server, so that it could update its internal column lists.
  • Yet another new option allows to script the "CREATE if table doesn't exist" logic before any table is created. Currently this feature is only implemented for tables, scripting similar logic for other objects and for DROPs may be added later.
  • A new type conversion matrix is now used to properly generate column type changes: in some situations ALTER COLUMN can be used, in others a column must be re-created and the data copied (such as TEXT to NTEXT conversions).
  • When adding a NOT NULL column into a table with data, a special SQL sequence is now used to ensure that there are correct default values for the new columns. The Diff maintains a list of default values for each data type, which you can customize on the 'Scripting/Tables/Default values' page.
  • The Diff is now much better at resolving dependencies(FKs and other constraints), although some situations can still confuse it.
  • The Diff now closes connections after comparison. Previous versions used to keep the database connections open during the whole session. If for any reason a connection would expire or got broken while viewing the differences, you'd be unable to run any scripts or refresh the comparison. As of ver. 1.80, both connections are closed as soon as the schema data is loaded, then re-opened as required when you start executing the scripts.
  • The registration dialog is redesigned for easier activation and re-issuing of the keys.
  • The "Choose serial" dialog is also redesigned and some new methods of license binding are added: low-level (format-resistant) IDE disk binding and binding to a portable USB storage device (flash drive). NOTE that the flash drive binding may or may not work with your particular flash drive device, depending on its model and manufacturer.

Bug fixes

  • Automation: The SelectNextDifference corrected. This method didn't work correctly when several schema objects had been previously selected.
  • DataDiff: in some unusual situations the program would try to synchronize rows with changes in "hidden" columns. Although (correctly) no code would be generated for such rows, all the extra checks and issuing of warnings for each row would slow the scripting down tremendously. The new version doesn't have this problem so that DataDiff scripting is very fast.
  • In one of the recent updates, the Diff lost its ability to sort schema items alphabetically. The correct ordering has been restored.
  • In some situation, the same 'DROP INDEX' statement could be scripted twice. This has been fixed.
  • A few other minor corrections in various places.
 

03-Mar-2005AdeptSQL Diff 1.70 [Build 29]

This version contains important bugfixes in DataDiff automation interface and some interesting improvements in DataDiff GUI

Quick links: SelectNextDifference(), GetRowIndex()

Corrections in DataDiff automation interface

  • SelectNextDifference() method did not work correctly when called with Expand parameter (SelectNextDifference(True)): it selected the next changed row starting from the first selected row, so it never went further down than the second changed record. Fixed.
  • GetRowIndex() function returned wrong value. Fixed.

Changes in DataDiff GUI

  • You can now use Shift with "Select Next/Prior Changed Row" commands to select multiple rows. This trick works both with toolbar buttons and with keyboard shortcuts. That is, you can use Ctrl-Alt-Shift-DOWN|UP to select the next or previous change, adding it to all previously selected rows.
  • Tooltip texts for the "Show Difference script" commands incorrectly indicated Ctrl-Shift-LEFT|RIGHT as shortcuts for these command. Actually, the shortcuts are Ctrl-Alt-LEFT|RIGHT. The tooltips are now updated accordingly.
  • DataDiff now opens SQL editor as an "owned" window, which means that the editor window stays on top of DataDiff, but is not modal (you can freely move focus between DataDiff and code). Together with the Ctrl-Alt-<Arrows> shortcuts described above, this means you can conveniently traverse the dataset from one change to another, instantly synchronizing records in either direction.
 

22-Feb-2005AdeptSQL Diff 1.70 [Build 28]

This version contains several minor bugfixes and improvements

Quick links: "SaveAs" in Unicode or UTF8, Changed some defaults, xplog70.dll

New features

  • "SaveAs" in Unicode or UTF8. The "Save As" dialog in the SQL editor now allows to specify saving in OEM (as before), Unicode or UTF8 formats. NOTE that it does not make the program truly Unicode-enabled: it can only display and correctly save scripts containing national character from a single code page. For example, you can have Latin and Cyrillic letters, or Latin and Greek, but not Cyrillic and Greek together.
  • Changed some defaults in the Schema Options dialog. Now a freshly installed copy of Diff will compare object- and statement permissions and will check whether tables have data or not. Before, these two options had to be manually enabled from the Schema Options dialog. These changes in initial setting don't affect those who is upgrading their existing copy of AdeptSQL Diff.

Bug fixes

  • xplog70.dll is no longer needed. That DLL is a part of standard MS SQL Server distribution, but sometimes DBAs remove it for security reasons. With xplog70.dll removed, the Diff could no longer access the schema, although it was only needed to obtain server's version number. Now the version information is fetched in a different way, so schema loading does not depend on that DLL.
 

05-Feb-2005AdeptSQL Diff 1.70 [Build 27]

This version contains several minor improvements in DataDiff, and fixes a bug in handling SQL_VARIANT columns

Quick links: "Hide LEFT-only objects", "Hide changed rows", DataDiff filters can be persistent, SQL_VARIANT was not supported

New features

  • "Hide LEFT-only objects" filter added to the schema tree filter menu. For historical reasons, previous versions only had "Hide RIGHT-only objects" option there.
  • "Hide changed rows" filtering option is added to the DataDiff view. It didn't look necessary until a user pointed out that sometimes he'd only be interested in "left-only" and "right-only" records as it allows him to quickly locate incorrectly entered primary keys.
  • DataDiff filters can be persistent now. This is implemented in exactly the same way as for the schema tree filters: there is now a new item in the DataDiff filter menu, indicating whether the filters should be stored in the registry.

Fixed bugs

 

28-Jan-2005AdeptSQL Diff 1.70 [Build 26]

Improved support for collation orders: some new options added, changes made in comparison and scripting. New options displaying "Summary collections"

Quick links: Redesigned "Ignored Details" page, Added "Ignore collation", New "Summary collections", Column collations not synchronized correctly, Problem comparing encrypted procs

New features

  • Redesigned "Ignored Details" page: controls in this option page has been rearranged in a (hopefully) more logical order.
  • Added "Ignore collation" checkbox on the same option page. It allows to ignore the differences in the COLLATE attributes of table columns and the entire database. Both the comparison and the scripting code have been modified to take into account the new setting.
  • New "Summary collections": Previous versions would display copies of all foreign keys and indexes (normally scattered throughout the schema tree) under a special node at the bottom of the tree, called "Summary collections". This version adds a new option page ("Display/Summary collections"), where you can choose which exactly objects should end up in their special "summary collections". Besides FKs and indexes supported before, you can now display there other constraints, triggers, permissions and extended properties.
  • For top-level objects that have different owners in the two databases, but considered matched according to the specified "owner map" (see the "Schema Scan/Ownership" option page), the program now displays both names in the schema tree (i.e. "dbo.table1 / user1.table1" instead of just "dbo.table1")
  • The help file has been updated according to the GUI changes described above

Fixed bugs

  • Column collations not synchronized correctly: when the only difference in a given character column was its collation, previous versions of the Diff would display the columns as changed, but would be unable to produce the synchro script for them. This is fixed now.
  • Problem comparing encrypted procs: as described here, previous versions would only respect the "consider changed" option when the unencrypted DB is on the left-hand side of the comparison. In this version, the comparison works correctly in both directions.
 

06-Jan-2005AdeptSQL Diff 1.70 [Build 25]

In this release we've added two new options for scripting of encrypted objects and made some minor correction to the GUI. The new options can be found on the "Options/Scripting/Procedures..." page of the Schema Options dialog

Quick links:

New features

  • One is "Script with SQLShield encryption", which is only useful for those who have SQL Shield server plugin installed. When this option is enabled, the Diff would generate a special "magic" comment ("WITH /*sqlshield*/ ENCRYPTION") causing the procedure to be encrypted in a special "unbreakable" way.
  • The other option is "Protect from tracing" and it causes another "magic" comment to be generated for encrypted procedures ("WITH ENCRYPTION /*sp_password*/"). When a procedure "WITH ENCRYPTION" is sent to the server, its full definition can be caught in a MS SQL Profiler log, which creates a security risk. However, if the profiler finds "sp_password" anywhere in the SQL (even in a comment), it would not show the statement text in the log.

Fixed bugs

  • Cleaner startup and closing of the current comparison: previous versions used to start-up with the empty schema panel visible, and leave visible the side-by-side panel and the message panel after you close a comparison. Now the program shows nothing but the connection dialog when there is no connection open.
  • There is an "Include owner name" group of options on the "Options/Schema scan/Ownership" page of the Schema Option dialog. One of its settings - "Don't include owner name" - was not correctly saved, so that after you choose it and restart the program, it would be back to the "Only if different..." setting. This version fixes the bug.
  • In trial mode, the previous versions used to look up a license file on removable disks (CDs or flash-memory). In some configurations it would cause ths system to pop up a "No disk" error message box. This disk enumeration is now removed.

Other changes

  • The help file has been updated to reflect the changes and the new options appeared in the recent releases.

Known issues

  • There is an option telling the Diff to consider any encrypted procedure different from its open-text counterpart and therefore always generate update script for such entities. However, this only works with the open-text SPs in the left-hand DB and the encrypted ones in the right-hand DB. Compare it the other way around, and the two procs would always be shown as identical. This problem will be fixed in a future release to make the comparison logic work same both ways. Meanwhile work around the problem by specifying the DB with encrypted procedures as the right-hand one in the comparison.
 


Copyright © Adept SQL Tools, 2002-2010
Designed by RaysLab