Ошибка функции GETDATE () на TSQL с всегда зашифрованным столбцом - PullRequest
0 голосов
/ 30 ноября 2018

Я работаю с SQL Server, размещенным в Azure.У меня есть таблица с именем «ОШИБКА» со столбцом «DATETIME» с включенной функцией «Всегда зашифровано».

CREATE TABLE [dbo].[ERROR]
(
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [DATETIME] [datetime] ENCRYPTED WITH (COLUMN_ENCRYPTION_KEY = [CEK_Auto1], ENCRYPTION_TYPE = Deterministic, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256') NOT NULL,
    [CODE] [varchar](10) NOT NULL,
    [MESSAGE] [varchar](500) NULL,

    CONSTRAINT [PK_ERROR] 
        PRIMARY KEY CLUSTERED ([ID] ASC)
) 

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

INSERT INTO [dbo].[ERROR] ([DATETIME], [CODE], [MESSAGE])
VALUES (GETDATE(), @@ERROR, ERROR_MESSAGE())

Моя проблема, когда я пытаюсь ввести значение GETDATE() в зашифрованный столбец, я получаю эту ошибку

Столкновение с типом операнда: datetime несовместимо с datetime, зашифрованным с помощью (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'CEK_Ac_A * * *в Интернете я включил ПАРАМЕТРИЗАЦИЮ ДЛЯ ВСЕГДА ШИФРОВАННЫХ на SSMS и объявил сначала, как это DECLARE @RAISEDTIME DATETIME = '20181130'.после этого никакой ошибки не возникло, и она была успешно вставлена, но при вызове GETDATE () в качестве значения [DECLARE @RAISEDTIME DATETIME = GETDATE()] я получаю эту ошибку:

Несоответствие схемы шифрования для столбцов / переменных '@RAISEDTIME',Схема шифрования для столбцов / переменных: (encryption_type = 'PLAINTEXT'), и выражение около строки '3' ожидает, что оно будет (encryption_type = 'DETERMINISTIC', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_K_name_name_name_name_name_name)Aeropuerto ') (или более слабый).

Я попытался отформатировать значение GETDATE() с ISO8601, но возникает та же ошибка, приведенная ниже.

Можете ли вы порекомендовать мне способ вставитьфактическое значение даты и времени с этой хранимой процедурой?

1 Ответ

0 голосов
/ 30 ноября 2018

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

В SQL Server 2017 параметризация столбца Always Encrypted равна возможно , см. Связанную статью.Но это работает только при определенных условиях.И это определенно не работает в SQL Server 2016.

Вам будет намного лучше отправить значение с клиента , как в большинстве случаев использования столбца Always Encrypted.

...