Подробная разница между двумя файлами dacpac

Я использую утилиту sqlpackage и MSBuild для создания исходных и целевых файлов .dacpac из нашей базы данных и проектов баз данных. Я знаю, что могу генерировать сценарии публикации и даже делать отчеты о развертывании, но эти отчеты только на высоком уровне. Что я хочу сделать, так это иметь возможность предоставить отчет, который показывает мне, что именно отличается между двумя dacpacs. Например, сгенерированный сценарий публикации и файл DeployReport.xml показывают мне, что конкретная хранимая процедура изменилась и будет перезаписана, однако не показывает, какие строки хранимой процедуры изменились, и поскольку это очень длинная хранимая процедура, выяснение этого вручную требует совсем немного усилий.

До сих пор я пытался извлечь содержащийся файл model.xml из файлов .dacpac и использовать инструмент Diff для сравнения model.xml из моего source.dacpac с target.dacpac, но если он создается из действующей базы данных и другие построены из проекта БД, то, к сожалению, они слишком разные, чтобы показать мне полезную визуализацию.

В Visual Studio я, конечно, могу открыть инструмент сравнения схем и таким образом сравнить свои dacpacs, но это слишком ручная работа, и я ищу более автоматизированное решение. Способ запуска этого сравнения схем из командной строки был бы хорош, по крайней мере.

Каков наилучший способ сравнить два файла dacpac и точно показать, в чем различия между ними на подробном уровне? то есть, что эти 5 хранимых проков изменились, и покажите мне визуально, какие строки изменились в каждом из пяти проков? Я согласен с тем, что склеиваю изолентой какое-то решение, но я не могу покупать какие-либо сторонние инструменты, я застрял с тем, что предоставляет MS, и с моими собственными ограниченными возможностями.


person Ryan Lind    schedule 14.09.2020    source источник


Ответы (2)


Не окончательное решение, но возможный путь:

# build publish script from old to new dacpac
SqlPackage.exe /a:Script /sf:old.dacpac /tf:new.dacpac /tdn:mydb /OutputPath:back.sql /Profile:publish.xml
# from new to old
SqlPackage.exe /a:Script /sf:new.dacpac /tf:old.dacpac /tdn:mydb /OutputPath:forth.sql /Profile:publish.xml

# compare them this way or another
Compare-Object -DifferenceObject (Get-Content ./forth.sql) -ReferenceObject (Get-Content ./back.sql) -SyncWindow 5 -IncludeEqual`
 | % { Write-Output ("{0} {1}" -f $_.SideIndicator, $_.InputObject); } | Out-File ./diff.txt
person Ivan Starostin    schedule 23.03.2021

Я думаю, вы ищете не тот инструмент.
Если вы хотите увидеть разницу между кодом конкретной хранимой процедуры с течением времени, вы должны зарегистрировать свой проект БД в системе управления версиями (например, git или TFS), а затем вы можете получать подробные отчеты о том, что было изменено и когда.
Это не только даст вам разницу между двумя версиями, вы сможете увидеть, какой разработчик написал конкретную строку и когда, или обобщить ваши изменения с течением времени.
Здесь есть много вариантов, как пометить, когда вы создали свой dacpac в репо, и чтобы получить подробный отчет, вы спросите у своего репо различия между двумя коммитами или версиями.

Вы можете прочитать о бесплатных частных репозиториях Git Azure здесь: https://azure.microsoft.com/en-us/services/devops/repos/

person Piotr    schedule 14.09.2020
comment
мы используем git. Я ищу возможность сравнить хранимую процедуру, как она определена в git, с тем, что на самом деле находится в базе данных. - person Ryan Lind; 18.09.2020
comment
Вы пытаетесь устранить дрейф кода, когда некоторые изменения развертываются вне процесса, управляемого git? Запуск сравнения схем, а затем обновление репозитория git из базы данных — хороший полуавтоматический способ сохранить дрейф в репо, и это всего около 5 кликов. Затем вы можете использовать все инструменты репо для красивой презентации. - person Piotr; 18.09.2020