SSDT发布后部署并始终加密

问题描述

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

sql Server 2019企业版 Windows Server 2016数据中心 Visual Studio 2019社区版16.7.2(本文发布时的当前版本)

列主密钥,列加密密钥和列定义在项目中,并且DB部署没有问题。这是发布后的脚本:

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中出现错误?有没有人能够复制和/或知道发生了什么事?

谢谢您的帮助。

内森

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...