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
);

并进行了测试.sql如下:

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

我像这样称呼sqlcmd:

sqlcmd.exe -g -b -S "localhostSQL2016" -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'

如果我将测试更改为.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 中的所有逻辑。

我做错了什么吗?这可能吗?为什么sqlcmd的"-g"参数没有区别?

目前,仅 SSMS 支持使用以下语法将数据插入始终加密的列。

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

您可以在此处和此处找到有关此内容的详细信息

创建表 tmp ( tmp_id int 身份 (1,1) 不为空,

测试(11)

整理Latin1_General_BIN2 使用 加密 (ENCRYPTION_TYPE = 随机, 算法 = 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = CEK_Auto1)
);

创建过程 [dbo]。[Proc_Test] @test 恩瓦尔查尔(11)

插入 TMP(测试)值 (@test);

上面的代码在 SSMS 中为我工作。

相关内容

  • 没有找到相关文章

最新更新