我正在处理企业项目中的存储过程加密。我们有一些应该在生产中受到保护的SP。
在sqlproj
的每个SP中设置WITH ENCRYPTION
参数没有问题。但是我想让这个指令是可选的:如果我在调试模式下构建项目 - 不要应用这个过程选项,否则 - 使用它。实际上,这里的主要目标是为没有加密的开发者提供数据库,但是在生产环境中加密SP。
在构建任务中使用PowerShell
脚本我可以修改生成的sql文件,并因此获取带有加密参数的脚本,但我想知道它如何与dacpac
一起使用。
有什么建议吗?存储过程取决于构建模式的加密选项
更新:
过了一段时间花在玩msbuild
。我决定以后SqlCore
目标停止(至少目前如此)与PowerShell
脚本任务的解决方案:
<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。
改变SP的post部署脚本可能会有所斩获。 –
@ aclear16是的,我在想,但还没有找到任何合理的解决方案。 –
在“WITH ENCRYPTION”的位置添加项目级变量可能是一个选项。对于您的开发环境,请将其添加为空字符串或注释行。对于需要加密的环境,请使用“WITH ENCRYPTION”作为值。在发布配置文件中设置它们。 –