У меня есть база данных SQL Server 2016 с включенным параметром «Всегда зашифровано». У нас есть несколько зашифрованных столбцов и хранимая процедура, которая обрабатывает обновления.
CREATE PROCEDURE UpdateRecord
@ID INT,
@EncryptedParameter01 NVARCHAR(255) = NULL,
@EncryptedParameter02 NVARCHAR(255) = NULL,
@EncryptedParameter03 NVARCHAR(255) = NULL,
@EncryptedParameter04 NVARCHAR(255) = NULL,
@EncryptedParameter05 NVARCHAR(255) = NULL,
@EncryptedParameter06 NVARCHAR(255) = NULL,
@EncryptedParameter07 NVARCHAR(255) = NULL,
@EncryptedParameter08 NVARCHAR(255) = NULL,
@EncryptedParameter09 NVARCHAR(255) = NULL,
@EncryptedParameter10 NVARCHAR(255) = NULL,
@EncryptedParameter11 NVARCHAR(255) = NULL,
@EncryptedParameter12 NVARCHAR(255) = NULL,
@EncryptedParameter13 NVARCHAR(255) = NULL,
@EncryptedParameter14 NVARCHAR(255) = NULL,
@EncryptedParameter15 NVARCHAR(255) = NULL,
@EncryptedParameter16 NVARCHAR(255) = NULL,
@EncryptedParameter17 NVARCHAR(255) = NULL,
@EncryptedParameter18 NVARCHAR(255) = NULL,
@EncryptedParameter19 NVARCHAR(255) = NULL,
@EncryptedParameter20 NVARCHAR(255) = NULL
AS
BEGIN
UPDATE myTable
SET Field01 = CASE WHEN @EncryptedParameter01 IS NULL THEN Field01 ELSE @EncryptedParameter01 END,
Field02 = CASE WHEN @EncryptedParameter02 IS NULL THEN Field02 ELSE @EncryptedParameter02 END,
Field03 = CASE WHEN @EncryptedParameter03 IS NULL THEN Field03 ELSE @EncryptedParameter03 END,
Field04 = CASE WHEN @EncryptedParameter04 IS NULL THEN Field04 ELSE @EncryptedParameter04 END,
Field05 = CASE WHEN @EncryptedParameter05 IS NULL THEN Field05 ELSE @EncryptedParameter05 END,
Field06 = CASE WHEN @EncryptedParameter06 IS NULL THEN Field06 ELSE @EncryptedParameter06 END,
Field07 = CASE WHEN @EncryptedParameter07 IS NULL THEN Field07 ELSE @EncryptedParameter07 END,
Field08 = CASE WHEN @EncryptedParameter08 IS NULL THEN Field08 ELSE @EncryptedParameter08 END
, Field09 = CASE WHEN @EncryptedParameter09 IS NULL THEN Field09 ELSE @EncryptedParameter09 END
, Field10 = CASE WHEN @EncryptedParameter10 IS NULL THEN Field10 ELSE @EncryptedParameter10 END
, Field11 = CASE WHEN @EncryptedParameter11 IS NULL THEN Field11 ELSE @EncryptedParameter11 END
, Field12 = CASE WHEN @EncryptedParameter12 IS NULL THEN Field12 ELSE @EncryptedParameter12 END
, Field13 = CASE WHEN @EncryptedParameter13 IS NULL THEN Field13 ELSE @EncryptedParameter13 END
, Field14 = CASE WHEN @EncryptedParameter14 IS NULL THEN Field14 ELSE @EncryptedParameter14 END
, Field15 = CASE WHEN @EncryptedParameter15 IS NULL THEN Field15 ELSE @EncryptedParameter15 END
, Field16 = CASE WHEN @EncryptedParameter16 IS NULL THEN Field16 ELSE @EncryptedParameter16 END
, Field17 = CASE WHEN @EncryptedParameter17 IS NULL THEN Field17 ELSE @EncryptedParameter17 END
, Field18 = CASE WHEN @EncryptedParameter18 IS NULL THEN Field18 ELSE @EncryptedParameter18 END
, Field19 = CASE WHEN @EncryptedParameter19 IS NULL THEN Field19 ELSE @EncryptedParameter19 END
, Field20 = CASE WHEN @EncryptedParameter20 IS NULL THEN Field20 ELSE @EncryptedParameter20 END
WHERE ID = @ID
END
Наша фактическая хранимая процедура является более сложной, это просто дает вам представление. Если это вызывается только с несколькими параметрами, это работает нормально. Однако, если он вызывается с более чем 10, процедура завершается ошибкой.
Сообщение об ошибке
Сообщение 206, Уровень 16, Состояние 2, Процедура UpdateRecord, Строка 0 [Стартовая Строка 0]
Столкновение с типом операнда: nvarchar несовместим с nvarchar (255), зашифрованным с помощью (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name_name_key_key_key_name_name_name_name_name_name_name_name_ject_name_name_name_name_name_name_name_name_ject_atabase_name_name_atabase_key_atabase_key_atabase_name_name_name_name_name_ject_name_name_name_ject_ject_name_name_name_ject_name_name_ject_name_name_ject_bject_name столбца
Это связано не с ошибками отдельных параметров, а с количеством передаваемых символов. Также эта процедура работала нормально до того, как было добавлено шифрование.
Любая дополнительная информация о том, почему это происходит, и обходные пути с благодарностью получены.
Большое спасибо.
Отредактировано, чтобы включить вызов:
Я вижу это как через VB, так и через T-SQL. Простейший случай - прямой вызов из SSMS. Я действительно проверил «Включить параметризацию для всегда зашифрованного». Параметры передаются правильно и функционируют правильно, если отправлено не более 10 параметров. Пример вызова:
DECLARE @PassedEncryptedParameter01 NVARCHAR(255) = 'Updated value 01'
EXEC UpdateRecord @Id=12345, @EncryptedParameter01 = @PassedEncryptedParameter01
Как видите, у меня есть объявленный тип, поэтому он соответствует. Проблема здесь не в том, как параметры определены, а в количестве отправляемых параметров.