SQL Server 2016 Как читать / писать в всегда зашифрованный столбец из командной строки?

Я могу читать и писать в столбец с всегда зашифрованными из приложения C# ASP.NET. Тем не менее, мне нужно сделать это из sqlcmd.

После некоторых исследований я обнаружил, что вам нужен параметр -g для активации параметра шифрования столбца и для обновления до версии sqlcmd 13.1, которую я сделал и проверил с помощью команды "sqlcmd -?".

Итак, я сделал тестовую таблицу:

create table tmp 
(
tmp_id int identity(1,1) not null,
test varchar(500)
COLLATE Latin1_General_BIN2
ENCRYPTED WITH 
   (ENCRYPTION_TYPE = RANDOMIZED, 
    ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', 
    COLUMN_ENCRYPTION_KEY = MY_Encryption_Key)  
null
);

И сделал test.sql со следующим:

insert into tmp (test) values ('mytest');

Я называю sqlcmd так:

sqlcmd.exe -g -b -S "localhost\SQL2016" -d "my_db_name" -i "D:\test.sql" -U "my_username" -P "my_password"

Но я получаю следующую ошибку, использую ли я "-g" или нет:

Operand type clash: varchar is incompatible with varchar(8000) encrypted with (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'MY_Encryption_Key', column_encryption_key_database_name = 'my_db_name') collation_name = 'SQL_Latin1_General_CP1_CI_AS'

Если я изменю test.sql на:

declare @test varchar(8000) = 'mytest';
insert into tmp (test) values (@test);

Затем я получаю еще одну ошибку (с или без -g):

Encryption scheme mismatch for columns/variables '@test'. The encryption scheme for the columns/variables is (encryption_type = 'PLAINTEXT') and the expression near line '2' expects it to be (encryption_type = 'RANDOMIZED', encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256', column_encryption_key_name = 'MY_Encryption_Key', column_encryption_key_database_name = 'my_db_name') (or weaker).

Мне это нужно, потому что в настоящее время существует приложение C#, которое принимает плоский файл, а затем оно загружается в БД через командную строку, вызывая файлы ".sql". Теперь некоторые столбцы должны быть зашифрованы. Итак, нам нужен sqlcmd для чтения / записи зашифрованных столбцов, чтобы избежать переписывания всей логики в C#.NET.

Я делаю что-то неправильно? Это вообще возможно? Почему параметр -g в sqlcmd не имеет значения?

2 ответа

В настоящее время вставка данных в всегда зашифрованный столбец с использованием следующего синтаксиса поддерживается только в SSMS.

declare @test varchar(8000) = 'mytest';
insert into tmp (test) values (@test);

Вы можете найти подробную информацию об этом здесь и здесь

Создать таблицу TMP ( tmp_id int identity(1,1) не равно NULL,

тест nvarchar (11)

COLLATE Latin1_General_BIN2 Зашифрованы с (ENCRYPTION_TYPE = RANDOMIZED, ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = CEK_Auto1)
ноль );

Создайте процедуру [dbo]. [Proc_Test] @test nvarchar (11) КАК

вставить в tmp (тест) значения (@test);

выше код работает для меня в SSMS.

Другие вопросы по тегам