近日,苦於不斷需要使用schema compare來更新數據庫的繁冗操作,決定潛心學習下如何使用msbuild來完成SchemaCompare的運行,初學版本爲:
1,首先構建你的Database Project,會生成dacpac文件
2,再使用手動模式進行SchemaCompare在VS中的操作,保存此操作,生成scmp文件
3,運行命令:msbuild E:\SolutionFolder\DatabaseProjFolder\Database.sqlproj /t:SqlSchemaCompare /p:target="dacpac file path" /p:SqlScmpFilePath="e:\DB.scmp" /p:XmlOutput="d:\1.xml" /p:Deploy="true"
出現錯誤:SchemaCompare error: The source participant is invalid or empty
Google答案,有些說需要增加VS版本號:/p:VisualStudioVersion=15.0
更改之後:msbuild E:\SolutionFolder\DatabaseProjFolder\Database.sqlproj /t:SqlSchemaCompare /p:target="dacpac file path" /p:SqlScmpFilePath="e:\DB.scmp" /p:XmlOutput="d:\1.xml" /p:Deploy="true" /p:VisualStudioVersion=15.0
運行出現同樣的錯誤。
輾轉之後,發現問題在於souce,而一直在糾結target,更改如下命令:
msbuild E:\SolutionFolder\DatabaseProjFolder\Database.sqlproj /t:SqlSchemaCompare /p:source="dacpac file path" /p:SqlScmpFilePath="e:\DB.scmp" /p:XmlOutput="d:\1.xml" /p:Deploy="true" /p:VisualStudioVersion=15.0
運行成功,並且直接更新上去,如下爲解釋:
/p:source:定義對比的source源
/p:SqlScmpFilePath="e:\DB.scmp":定義對比的scmp文件,其中文件定義已經包含了target的定義,此例中爲DB的ConnectionString
/p:Deploy="true" :直接將差異更新到target的數據庫中
至此,確認SqlSchemaCompare的命令可以正常在msbuild端運行並且能更新數據庫。
此後需要探索的問題爲:如何參數化使對比結果能排除登陸用戶對比。
【參考】
1,https://blogs.msdn.microsoft.com/ssdt/2014/07/15/msbuild-support-for-schema-compare-is-available/