Я работаю над шифрованием хранимых процедур в корпоративном проекте. У нас есть куча SP, которые должны быть защищены в рабочей среде.
Нет проблем установить параметр WITH ENCRYPTION
в каждом SP, который находится в sqlproj
. Но я хочу сделать эту директиву необязательной: если я собираю проект в режиме отладки - не применяйте этот параметр процедуры, иначе - используйте его. Собственно основная цель здесь - получить БД для разработчиков без шифрования, а на продакшене - зашифрованные SP'ы.
Используя скрипт PowerShell
в задаче сборки, я могу изменить сгенерированный файл sql и в результате получить скрипт с параметром шифрования, но мне интересно, как он будет работать с dacpac
.
Есть предложения?
Обновление:
Через некоторое время, проведенное за игрой с msbuild
. Решил остановиться (по крайней мере пока) на решении с PowerShell
скриптовой задачей после SqlCore
цели:
<Import Project="$(ExtensionTasksPath)MSBuild.ExtensionPack.tasks" Condition="Exists('$(ExtensionTasksPath)MSBuild.ExtensionPack.dll')" />
<UsingTask TaskFactory="PowershellTaskFactory" TaskName="CreateDecryptedScript" AssemblyFile="$(PowerShellTaskAssembly)" Condition="Exists('$(PowerShellTaskAssembly)')">
<ParameterGroup>
<File Required="true" ParameterType="System.String" />
<ResultFile Required="true" ParameterType="System.String" />
</ParameterGroup>
<Task>
<![CDATA[
(Get-Content $file) | Foreach-Object {$_ -replace 'WITH ENCRYPTION', '--WITH ENCRYPTION'} | Set-Content $resultfile
]]>
</Task>
</UsingTask>
<Target Name="CreateDecryptedScript" AfterTargets="SqlCore">
<CreateDecryptedScript File="$(OutputPath)$(CreateScriptFileName)" ResultFile="$(OutputPath)$(DecryptedScriptName)" Condition="Exists('$(PowerShellTaskAssembly)')" />
</Target>
В итоге после пересборки проекта имеем скрипт для создания БД без шифрования.
Но publish
, который вызывается из проекта, не заставляет это делать, и мы изменим все SP с шифрованием.