2017-05-25 87 views
2

我有一列"Amount" numeric(18,2),我使用SSMS v17的加密列嚮導進行了加密。列數據現在被加密。SQL Server 2016始終加密 - 在視圖中始終使用加密列的比較和計算表達式

不過,我有一個使用類似的視圖:

create SampleView 
as 
    Select 
     *, Amount * Rate as TotalAmount 
    From 
     SampleTable 
    Where 
     Amount > 0 
go 

Ratenumeric(18,8)類型。

我無法創建此視圖。它提供了數據類型不兼容的錯誤,因爲一列是加密的而另一列是明文。從我試過的各種排列中,我發現Where>子句帶有> 0會導致問題,並且選擇列表中的金額*比率不起作用。

有關Amount*Rate該錯誤是(I註釋where子句)

操作數類型衝突:使用(將encryption_type = 'DETERMINISTIC',encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name ='加密數字(18,2) SampleDB_CEK」,column_encryption_key_database_name = 'SAMPLEDB')是不兼容的數字

相關Where Amount>0錯誤的是(我評論金額*價格在SELECT子句中)

的數據類型的數字(18,2)與(將encryption_type = 'DETERMINISTIC',encryption_algorithm_name = 'AEAD_AES_256_CBC_HMAC_SHA_256',column_encryption_key_name = 'SampleDB_CEK',column_encryption_key_database_name = 'SAMPLEDB')和TINYINT加密是在比操作者更大的不兼容。

我嘗試了這些,但它沒有工作,以及:

Where Amount > cast(0 as numeric(18,2) 
Select Amount * cast(Rate as numeric(18,2) 

,因爲它是觀點我們不能聲明變量。而且這個視圖在許多存儲過程中得到了使用。

任何想法讚賞。

+0

請貼上確切的錯誤 – TheGameiswar

+0

@TheGameiswar我現在已經粘貼了確切的錯誤。謝謝。 – CleanBold

+0

看來where子句只支持where子句包含加密列時的相等查詢 – TheGameiswar

回答

1

加密列中不允許比較和數學運算。 目前加密列上唯一可能的操作是平等的。 bastos的答案將不起作用,因爲SQL Server沒有密鑰。

您可能必須在客戶端應用程序中實現此邏輯。

從官方文檔

確定性加密總是生成 任何給定的純文本值相同的加密值。使用確定性加密允許在加密的 列中查找點,等式連接,分組和索引。但是,也可能允許未經授權的用戶通過檢查加密列中的模式來猜測 有關加密值的信息,尤其是在加密值(如True/False或North/South/East /西部地區。 確定性加密必須使用字符列的排序順序的列排序規則。

隨機加密使用方法 以不太可預測的方式加密數據。隨機加密 更安全,但會阻止搜索,分組,索引和 加入列。

相關問題