2017-05-24 59 views
3

我能夠讀取和寫入從C#ASP.NET應用程序始終加密的列。不過,我需要從sqlcmd來完成。SQL Server 2016如何從命令行讀取/寫入始終加密的列?

經過一番研究,我發現here,你需要-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中的所有邏輯。

我做錯了什麼?這甚至有可能嗎?爲什麼sqlcmd的「-g」參數沒有什麼區別?

+0

嘗試在插入時將值轉換爲varchar(8000)。 –

+0

它沒有工作,我已經嘗試 – user7792598

+0

如果這個工作,你會有效*規避總是加密功能,因爲你的.sql文件中的字符串*未加密*。 '-g'選項允許'sqlcmd'從AE列中檢索數據(如果它有權訪問這些鍵),但它仍然不能使用未加密的值運行任意T-SQL,但不能超過其他客戶端。這些值必須從支持它的客戶端進行正確的參數化。這意味着純文本T-SQL腳本已經不存在了。 SSMS現在有一些黑客支持,因爲它*是一個痛苦的屁股,但'sqlcmd'不夠複雜。 –

回答

1

當前使用以下語法將數據插入到始終加密的列中是僅在SSMS中受支持。

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

你可以找到關於這個herehere

0

創建細節表TMP tmp_id INT標識(1,1)NOT NULL,

測試爲nvarchar(11)

COLLATE Latin1_General_BIN2 ENCRYPTED WITH (將encryption_type =隨機, 算法= 'AEAD_AES_256_CBC_HMAC_SHA_256', COLUMN_ENCRYPTION_KEY = CEK_Auto1)
);

創建步驟[dbo]。[Proc_Test] @test爲nvarchar(11) AS

插入到TMP(測試)值(@test);

上面的代碼在SSMS中爲我工作。