SSDT 部署后且始终加密

问题描述 投票:0回答:1

将种子数据部署到启用了 AlwaysEncrypted 的表时,遇到 SSDT 中的问题。

SQL Server 2019 企业版 Windows Server 2016 数据中心 Visual Studio 2019 社区版 16.7.2(截至本文的当前版本)

列主密钥、列加密密钥和列定义都在项目中,并且数据库部署没有问题。这是部署后脚本:

SET IDENTITY_INSERT DBO.Table1 ON

IF NOT EXISTS (SELECT * FROM DBO.Table1 WHERE Table1ID = 0)
BEGIN
    --need to parameterize values for always encrypted columns
    declare @fname nvarchar(20) = ''
    declare @lname nvarchar(25) = ''

    INSERT INTO DBO.Table1 (Table1ID, [FirstName], [LastName], [DateOfBirth] )
    VALUES (0,@fname,@lname,'2999-09-09')
END

SET IDENTITY_INSERT DBO.Table1 OFF

当在设置了AlwaysEncrypted标志的SSMS中直接执行此操作时,插入成功。对于正常模式和 SQLCMD 模式都是如此。

通过已发布的配置文件使用 SSDT 进行发布时,出现以下错误:

(101,1):SQL72014:.Net SqlClient 数据提供程序:消息 33277,级别 16,状态 6,第 13 行 列/变量“@fname”的加密方案不匹配。列/变量的加密方案是 (encryption_type = 'PLAINTEXT'),第 '13' 行附近的表达式期望它是 DETERMINISTIC 或 PLAINTEXT。 (89,0): SQL72045: 脚本执行错误。执行的脚本:

做了一些研究,似乎连接字符串设置“列加密设置=已启用”未在发布配置文件中设置。如果我尝试在 SSMS 中运行生成的部署脚本而不设置 AlwaysEncrypted 标志,我会收到相同的错误。尝试通过用户界面进行设置,它会恢复为“禁用”,并且无论我做什么都不会保存。然后,我尝试将其直接保存到发布配置文件 XML,而不是通过 UI,虽然保存了,但错误并没有改变。

我尝试在启用 SQLCMD 模式且 AlwaysEncrypted 标志设置 = true 的情况下在 SSMS 中执行 SSDT 生成的部署脚本,有趣的是,我收到了不同的错误。该错误是:

执行批处理时发生错误。错误消息是: ExecuteReader:CommandText 属性尚未初始化

问题:

  1. 是否可以在包含使用 AlwaysEncrypted 加密的列的表中执行部署后脚本?如果是这样,我需要做什么才能使其正常工作?
  2. 为什么在 SQLCMD 中运行时 SSMS 会出现错误?有谁能够复制这个和/或知道发生了什么?

谢谢您的帮助。

内森

sql-server sql-server-data-tools database-project always-encrypted ssdt-2019
1个回答
0
投票

作为更新,这是 SSDT 中的一个已知问题。我知道他们正在研究它,但不确定它是否在 VS2022 中。您可以添加一个 MS 问题:

https://learn.microsoft.com/en-us/answers/questions/89403/always-encrypted-and-ssdt-post-deployment

此外,本文还提供了一种解决方法。 https://techcommunity.microsoft.com/t5/sql-server-support-blog/ssdt-dacfx-pre-post-deployment-scripts-containing-dml-for-always/ba-p/1878473

© www.soinside.com 2019 - 2024. All rights reserved.