2012-11-06 23 views
5

我正在处理企业项目中的存储过程加密。我们有一些应该在生产中受到保护的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。

+0

改变SP的post部署脚本可能会有所斩获。 –

+0

@ aclear16是的,我在想,但还没有找到任何合理的解决方案。 –

+0

在“WITH ENCRYPTION”的位置添加项目级变量可能是一个选项。对于您的开发环境,请将其添加为空字符串或注释行。对于需要加密的环境,请使用“WITH ENCRYPTION”作为值。在发布配置文件中设置它们。 –

回答

2

很容易解密“加密”的存储过程。我建议你不要打扰他们加密。

如果必须进行加密,我建议在DEV一个部署后的步骤,解密每个加密存储过程,一个接一个。您可以使用sp_execsql和链接中的信息轻松创建此类步骤。

+0

是的,这是它的工作方式,但我仍然在寻找灵活的解决方案,不需要对开发环境上的SP进行操作。 –

+1

我想你已经误解了我。我的意思是根本不加密 - 这是浪费时间。 – Ben

+0

哦,我明白了。但这不是我的决定。不幸的是我仍然需要加密SP。但感谢指点。 +1) –