У меня есть пароль, хранящийся в таблице SQL Server, которая «всегда зашифрована» (детерминистически). У меня есть пакет служб SSIS, который имеет параметр уровня пакета, называемый «parmPassword». Я пытаюсь использовать значение этого зашифрованного столбца для установки параметра SSIS по умолчанию, создавая выполнение в SSISDB со значением параметра.
У меня есть "настройка шифрования столбца = включено" в строке подключения. Параметризация установлена для запроса.
Этот код работает нормально (в 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 inline вместо использования @ var3, но я не думаю, что это возможно.
У кого-нибудь есть идеи, как этого добиться?