Драйвер Microsoft JDBC для Java не может найти ключ шифрования столбца Azure Always Encrypted после изменения ключа шифрования

Я использую Java с Spring Framework, подключенным к базе данных SQL через драйвер Microsoft JDBC.

В одной из таблиц базы данных есть столбец, зашифрованный с помощью постоянного шифрования Azure. Недавно я изменил ключ шифрования столбца (расшифровал данные со старым ключом, зашифровал данные с новым ключом), и хотя служба Java использует клиент, прошедший проверку подлинности для доступа к обоим ключам шифрования столбца, я получаю сообщение в приложении Java :

Ошибка SQL: 33294, SQLState: S0004

com.microsoft.sqlserver.jdbc.SQLServerException: некоторые параметры или столбцы пакета требуют шифрования, но не удается найти соответствующий ключ шифрования столбца. Используйте хранимую процедуру sp_refresh_parameter_encryption, чтобы обновить метаданные параметров модуля.

Я попытался повторно развернуть службу, но безуспешно. Я также пытался запустить процедуру sp_refresh_parameter_encryption, но для нее требуется модуль или хранимая процедура в качестве параметра, и я не вижу какой-либо очевидной хранимой процедуры, которую можно было бы передать ей.


person Kent Munthe Caspersen    schedule 11.12.2018    source источник


Ответы (1)


Я обнаружил, что одна или несколько процедур кэшировались с использованием старых ключей шифрования столбцов. Запустив запрос

ALTER DATABASE SCOPED CONFIGURATION CLEAR PROCEDURE_CACHE;

кеш почистил, новые ключи загрузил и все прошло нормально.

person Kent Munthe Caspersen    schedule 11.12.2018
comment
Только что заметил, что это также устранило еще одну проблему, с которой я столкнулся год спустя в службе Java Spring. После изменения типа шифрования столбца с RANDOMIZED на DETERMINISTIC я начал получать следующие ошибки в своем Java-коде: Operand type clash: nvarchar(6) encrypted with (encryption_type = 'DETERMINISTIC', ...) is incompatible with nvarchar(12) encrypted with (encryption_type = 'RANDOMIZED', ...). Перезапуск службы ничего не дал, но очистка PROCEDURE_CACHE с запросом в ответе решила проблему. - person Kent Munthe Caspersen; 28.11.2019