It's been some time since i added anything to the blog and a lot has happened in the last few months.
I have run into many number of challenging stuff at Xero and spread my self to learn new things.
As a start i want to share a situation where I used a dacpac to compare the differences of a database schema's.
- This involves of creating the two dacpacs for the different databases
- Comparing the two dacpacs and generating a report to know the exact differences
- Generate a script that would have all the changes
How to generate a dacbpac
The easiest way to create a dacpac for a database is through management studio ( right click on the databae --> task --> Extract data-tier-application). This will work under most cases but will error out when the database has difffrent settings. ie. if CDC is enabled
To work around this blocker, you need to use command line to send the extra parameters. Bellow is the command used to generate the dacpac.
"%ProgramFiles(x86)%\Microsoft SQL Server"\110\DAC\bin\sqlpackage.exe /Action:Extract /SourceServerName:XLW-CNU415CD8B /SourceDatabaseName:AdventureWorks2012 /TargetFile:AdventureWorks2012_v1.dacpac /p:IgnoreExtendedProperties=True /p:IgnorePermissions=False /p:ExtractApplicationScopedObjectsOnly=True
Note
- In this case i have created the dacpac against the AdventureWorks2012 database and called the dacpac AdventureWorks2012_v1.dacpac
- The extra parameters that i have passed start with "/p", you can read more on SQLPackage.exe @ https://msdn.microsoft.com/library/hh550080(v=vs.103).aspx
Compare the dacpacs
Now that i have the dacpac in place, its a matter of identifying the differences. Being the pessimistic person i am, I preferred to view the a list of changes before they were applied on the destination database. In-order to that I would request a deployreport instead of a script.
"\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /a:DeployReport /sf:AdventureWorks2012_v1.dacpac /tf:AdventureWorks2012_v2.dacpac /tdn:AdventureWorks2012.db /op:AdventureWorks2012_v1.xml
Above I have requested for the deploy report in xml, and used the AdventureWorks2012_v1.dacpac and AdventureWorks2012_v2.dacpac for the comparison.
Similarly , just by changing the action to script, the .sql file can be generated
"\Program Files (x86)\Microsoft SQL Server\110\DAC\bin\SqlPackage.exe" /a:Script /sf:AdventureWorks2012_v1.dacpac /tf:AdventureWorks2012_v2.dacpac /tdn:AdventureWorks2012.db /op:AdventureWorks2012_v1.sql
As usual, i hope this helps someone in the big world of sql.
Your post is very useful. I have one doubt.. The sql script generated after comparing two dacpac files cannot be executed direclty in SSMS?
ReplyDeleteHi Ramya
DeleteYes you are right, you can't directly execute it on default setting on SSMS. It requires that you change the SSMS mode to SQLCMD.
Cheers
Jude
Hi Jude, Is there anyway to insert If EXIST check when generating script after comparing two Dacpac?
ReplyDeleteHi
DeleteAs much as i know there no way to do that. That said yu should be able to use the additional parameters and unnecessary data.
Hope that make sense.
Thanks
Jude
When tried to compare dcapac's i got the error
ReplyDelete*** An error occurred during deployment plan generation. Deployment cannot continue.
Missing values for the following SqlCmd variables:ClientName.
v/:ClientName=
Deleteyou might get more warnings with missing variables,Just add them.
FYI These variables are set in your project
I got this error when comparing a 2014 vs 2012 dacpac ;
ReplyDelete*** An error occurred during deployment plan generation. Deployment cannot continue.
A project which specifies SQL Server 2014 as the target platform cannot be published to SQL Server 2012.
Solution
Just flip the dacpacs for /sf and /tf
I got this issue can some one help me
ReplyDeleteSqlPackage.exe : *** An error occurred during deployment plan generation. Deployment cannot continue.
At D:\CompareDacPac.ps1:55 char:9
+ & "$SqlPackagePath" /a:script /tf:$v2 /sf:$SourceDACPAC /tdn: ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (*** An error oc...annot continue.:String) [], RemoteException
+ FullyQualifiedErrorId : NativeCommandError
have you tried removing the double quotes on either side of the $SqlPacjkagepath ? it does appear to be the way the PS variable is used.
DeleteThank You and I have a keen offer: What Is House Renovation average cost to remodel a house
ReplyDelete