将种子数据部署到启用了 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 属性尚未初始化
问题:
谢谢您的帮助。
内森
作为更新,这是 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