1

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

SQL Server 2019 Enterprise Windows Server 2016 Data Center Visual Studio 2019 Community Edition 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: 脚本执行错误。执行的脚本:

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

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

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

问题:

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

感谢您的帮助。

弥敦道

4

0 回答 0