Хранимый процесс всегда зашифрован и CASE со значением по умолчанию - PullRequest
0 голосов
/ 24 января 2019

Я тестирую всегда зашифрованный, чтобы потенциально использовать его в устаревших приложениях.Для теста я зашифровал столбец NVARCHAR в одной из базовых таблиц поиска в приложении.Я получил предупреждения от мастера шифрования, предупреждающие меня о том, что некоторые хранимые процедуры не соответствуют требованиям.После проверки процедуры я заметил, что она жалуется на конкретный оператор CASE для зашифрованного столбца (ПРИМЕЧАНИЕ: зашифрованный столбец - adl.adl_Text NVARCHAR (50) ).Столбец возвращает значение по умолчанию (предварительно определенная строка) в случае, если таблица PK равна нулю.Я понимаю, что ISNULL может работать здесь, но это пример проблемы.Сравнение строк с зашифрованным столбцом не проводится, поэтому я немного запутался в том, в чем проблема.

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

DECLARE @add_removed NVARCHAR(50)
SET @add_removed = 'Address Removed'

SELECT addr.Field1
  , addr.Field2
  , CASE WHEN addr.FieldPK IS NULL THEN @add_removed ELSE adl.adl_Text END AS StatusReason
FROM address addr
LEFT JOIN Address_Delete_Reason adl ON adl.PK = addr.adl_FK

У меня ранее было:

SELECT addr.Field1
  , addr.Field2
  , CASE WHEN addr.FieldPK IS NULL THEN 'Address Removed' ELSE adl.adl_Text END AS StatusReason
FROM address addr
LEFT JOIN Address_Delete_Reason adl ON adl.PK = addr.adl_FK

Я получаю ошибку:

Error: Operand type clash: varchar is incompatible with nvarchar(50) encrypted with (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Auto1', column_encryption_key_database_name = 'DBTEST').

1 Ответ

0 голосов
/ 25 января 2019

Поскольку процедура существовала до применения шифрования, попробуйте обновить всегда зашифрованные метаданные для сохраненного процесса, используя sp_refresh_parameter_encryption

Метаданные шифрования для параметров модуля могут устареть, если:

Свойства шифрования столбца в таблице, на которую ссылается модуль, обновлены.Например, столбец был удален, и был добавлен новый столбец с тем же именем, но другим типом шифрования, ключом шифрования или алгоритмом шифрования.

Возможно, вам потребуется это сделатьдля каждого процесса, который ссылается на недавно зашифрованные объекты:

EXEC sys.sp_refresh_parameter_encryption @name = '[YourSchema].[YourProc]'
...