Comments
5 comments
-
In case my explanation above does not make sense, here is a clarification based on a simplified case of a single SVN checkin.
If I attempt to add a Migration Script to this check in, the following code is generated for me (note that I have removed a lot of lines to make my case more clear to the reader).EXEC sp_dropextendedproperty N'MS_Description', 'SCHEMA', N'dbo', 'TABLE', N'Timesheets', 'COLUMN', N'Rostered' GO ALTER TABLE [dbo].[Timesheets] DROP COLUMN [Rostered] GO
Now I do not change this code, but I still save it as a migration script. Then I use SQL Compare to generate a script for me that I can use to add this change to an foreign database. The resulting code will looks something like this.CREATE TABLE #tmpErrors (Error int) GO BEGIN TRANSACTION GO EXEC sp_dropextendedproperty N'MS_Description', 'SCHEMA', N'dbo', 'TABLE', N'Timesheets', 'COLUMN', N'Rostered' GO ALTER TABLE [dbo].[Timesheets] DROP COLUMN [Rostered] GO IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION GO IF @@TRANCOUNT>0 BEGIN PRINT 'The database update succeeded' COMMIT TRANSACTION END ELSE PRINT 'The database update failed' GO
Since we never put anything inside the #tmpErrors table, this transaction will never rollback, and we could end up with a partial check in (maybe not in this simplified case, but in more complex ones).
If I delete my migration script and try SQL Compare again, it generates much better code:CREATE TABLE #tmpErrors (Error int) GO BEGIN TRANSACTION GO EXEC sp_dropextendedproperty N'MS_Description', 'SCHEMA', N'dbo', 'TABLE', N'Timesheets', 'COLUMN', N'Rostered' GO IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION GO IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END GO ALTER TABLE [dbo].[Timesheets] DROP COLUMN [Rostered] GO IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION GO IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END GO IF EXISTS (SELECT * FROM #tmpErrors) ROLLBACK TRANSACTION GO IF @@TRANCOUNT>0 BEGIN PRINT 'The database update succeeded' COMMIT TRANSACTION END ELSE PRINT 'The database update failed' GO
This code IS transaction safe. Either it will all be committed or none of it will. -
Thanks for letting us know. I have logged a bug (SC-6765) so this can be looked into. SQL Compare is not including your own migration script code into the transaction handling framework of SQL Compare.
-
Anything new on this subject?
Since a bug has been logged, does this mean that Migration Script SHOULD have been padded with the be padded with the code below after every command?IF @@ERROR<>0 AND @@TRANCOUNT>0 ROLLBACK TRANSACTION GO IF @@TRANCOUNT=0 BEGIN INSERT INTO #tmpErrors (Error) SELECT 1 BEGIN TRANSACTION END GO
-
Hi!!
Thanks a lot for providing information about SQL Compare.SQL Queries can be used to retrieve large amounts of records from a database quickly and efficiently.SQL databases use long-established standard which is being
adopted by ANSI & ISO. Non-SQL databases do not adhere to any clear standard. -
Hi SmithCOLE,
I think you have replied to the wrong post. Your reply has no relevance for this subject.
Add comment
Please sign in to leave a comment.
We often use SQL Compare to generate DB script to be run on our customer's databases. If the intermediary SVN checkin(s) contain only auto generated code (i.e. no migration script), SQL Compare adds the following code block after every GO
This ensures that the script is fully rollbacked if an error occurs at any time during the execution.
Unfortunately, if the intermediary SVN checkin has a Migration Script, these blocks of code are not added. Though the resulting script still has a BEGIN/ROLLBACK/COMMIT TRANSACTION block these do not really do anything useful. Any error in the middle of the script will result in partial commits.
I hope someone can help me with this problem. Hopefully I am merely missing a setting somewhere.