2017-08-31 115 views
0

我們有一個程序,允許用戶將未經修改的原始輸入數據映射到標準化的最終表。無動態SQL的自定義SQL列公式

一般來說這是一個簡單的一對一匹配,而不需要特殊的邏輯。

例如; raw_table.raw_col_1將映射到final_table.col_1,raw_table.raw_col_2將映射到final_table.col_2等

然而,一個客戶希望有final_table.col_3能力如下映射:

case 
    when (raw_col_1 = 'S12' and raw_col_2 = 'D18') or raw_col_3 is not null then raw_col_3  
    else 'GF17' 
end 

其他類似的請求也在那裏。

加載final_table時,我可以使用動態SQL輕鬆實現此目的。但是,這給我們開放SQL注入攻擊。

有沒有一種方法,我們可以允許這種類型的自定義字段映射的不訴諸動態SQL?

+0

變量加入,使像查詢:'情況下(@var =真實raw_col_1 ...)...其他raw_col_3 end' –

+0

我認爲簡單的答案是:沒有。它甚至不是恆定的(*其他類似的請求也存在。*)以滿足用戶驅動的可變性,它必須是動態的。 –

回答

1

你進入,允許開發工具的面積暴露在運行時向最終用戶 - 在某些時候的配置變得足夠複雜,它需要或模擬代碼的能力。你有兩個選擇:

1)提供一個用戶界面,可以考慮使用案例 - 例如簡化查詢生成器。並確保所有單個組件都得到驗證或綁定。無論這是否可行,都將在複雜程度上結束,以及您希望將多少功夫放入此類用戶界面。

2)提供管理級別的定製,允許客戶提供更復雜的邏輯。由於這是一個Oracle數據庫,因此您可以讓它們將此作爲可以返回該值的PL/SQL函數提供。

的第二選項既可以通過用戶界面來完成,或通過後端裝載機。但是,無論哪種情況,您都應確保管理員瞭解這是高度特權的功能,並審覈進入的內容以及訪問權限。

您也可以配置這種方式,使得軟件包處於受限模式中的權限更多(並且使用定義者的權限調用),儘管最好的方式取決於您的數據庫版本正在使用。 12c在這方面提供了更多的安全功能。