我们正在尝试在我们的一个应用程序中添加 Always encrypted,我们希望它能与我们的 CI 流一起工作。
我们使用 DACPAC 部署 Azure Devops。 到目前为止一切正常,但我们面临着始终加密的挑战......
每个 SQL 环境都需要在 Azure Key Vault 中有一个不同的 key 。 我们发现自动执行此操作的方法是使用 SSDT 变量 (ref)
CREATE COLUMN MASTER KEY [ResponseKey] WITH (
KEY_STORE_PROVIDER_NAME = N'AZURE_KEY_VAULT',
KEY_PATH = N'[$(OurVariableName)]' );
当我们的数据库和 DACPAC 之间的比较完成时,脚本总是包含键的 Drop + Create,即使键的值相同。我们尝试输出生成的脚本,Azure Key vault 中的 key 值位于脚本的变量部分。 就好像,比较不适用于变量。
有人做过这个吗?
另外,当我们添加一个新的加密列时,生成的脚本总是失败,提示表中已有数据。这似乎与 this link 相反
最佳答案
经过几天的研究,似乎无法使用变量来更改用于在我们每个环境中部署 DACPAC 的 key 值。 (或者我们还没有找到方法!)。
我们使用的解决方法是在我们的每个环境中通过脚本部署 key 和加密列(在每个环境中使用不同的 key ),然后我们修改我们的 DACPAC 以匹配手动完成的操作。
我们在 XML 发布配置文件中添加了两个选项:
<ExcludeColumnEncryptionKeys>True</ExcludeColumnEncryptionKeys> <ExcludeColumnMasterKeys>True</ExcludeColumnMasterKeys>
当我们在 CI 流程中部署时,不会比较键,即使它们不同也不会更改结构。
如果能够使用变量而不是手动执行操作会很好,但看起来就是这样!
CI + Always encrypted 不要放在一起!
关于sql-server - 带有 SQL Always Encrypted 列的 CI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619527/