如何将始终加密的列值传递给SSIS包参数

时间:2019-05-08 21:23:17

标签: sql-server ssis always-encrypted

我在“始终加密”(确定性)的SQL Server表中存储了密码。我有一个SSIS程序包,它的程序包级别参数称为“ parmPassword”。我正在尝试使用该加密列值通过在SSISDB中使用参数值创建执行来设置默认SSIS参数。

我在连接字符串中有“列加密设置=启用”。为查询设置参数。

此代码可以正常运行(在SSMS中):

DECLARE @var3 nvarchar(100) = (Select [SSISPackageParameterValue]
  FROM [mydb].[environment].[myalwaysencyptedtable]
  Where SSISPackageParameter = 'parmPassword'
  Collate Latin1_General_BIN2)

  select @var3

它将返回我的密码。

mypassw0rd

但是当我添加EXEC时,它不再起作用了,可能是因为变量@ var3被传递了太多次:

DECLARE @var3 nvarchar(100) = (Select [SSISPackageParameterValue]
  FROM [mydb].[environment].[myalwaysencyptedtable]
  Where SSISPackageParameter = 'parmPassword'
  Collate Latin1_General_BIN2)

EXEC [SSISDB].[catalog].[set_execution_parameter_value] @execution_id,
    @object_type=30,
      @parameter_name=N'parmPassword',
      @parameter_value=@var3

我在SSMS中运行以上代码时收到此错误。 (在未加密的表上运行时,上面的代码也可以正常工作。)该错误在EXEC行中出现:

Encryption scheme mismatch for columns/variables '@var3'. The encryption scheme for the columns/variables is (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'mydb') and the expression near line '0' expects it to be (encryption_type = 'PLAINTEXT'). 

Microsoft说,如果不对变量进行参数化,则可能导致此错误:

https://blogs.msdn.microsoft.com/sqlsecurity/2016/12/13/parameterization-for-always-encrypted-using-ssms-to-insert-into-update-and-filter-by-encrypted-columns/

他们说您必须在一行中全部声明变量才能发生这种情况。我认为,如果我可以内联定义@parameter_value而不是使用@ var3,这可能会起作用,但我认为这是不可能的。

有人对如何实现这一目标有任何想法吗?

0 个答案:

没有答案