2012-04-05 36 views
-1

我需要將存儲過程執行腳本存儲在數據庫表中。將Sql腳本存儲在數據庫表中的最佳方法

作爲一個例子:

exec proc_name 'somedata' 

這些是在將要改變已通過審覈流程數據之後稍後的時間執行。

清理腳本的最佳方法是什麼,以便該語句不能用於sql注入。

是否有我可以使用的編碼的特定類型?或者就像在上執行替換一樣簡單'

+7

您是否熟悉存儲過程? – Colin 2012-04-05 01:54:02

+1

需要保存什麼樣的「SQL腳本」?您沒有提供可用於回答您的問題的信息。請編輯並提供有關您實際嘗試執行的操作的詳細信息;正如所寫,這不是一個真正的問題,應該關閉。謝謝。 :) – 2012-04-05 02:00:47

+0

您好,感謝您的回覆,但我的問題很清楚,「什麼是最好和最安全的方式來存儲SQL腳本以供執行」,SQL腳本?好的可能是任何東西,但在這種情況下,它是一個存儲過程的執行,如「exec proc_name'somedata'」 - 希望清除混淆 – shenku 2012-04-05 03:20:13

回答

0

您可以存儲您的腳本,以便稍後在「存儲過程」或計劃作業中執行。我沒有看到編碼存儲過程的任何理由,因爲您可以將用戶權限設置爲防止不同的用戶閱讀甚至看到它們。

+0

它的一個相當複雜的元數據結構,用戶將會改變其中的數據,它不是一個真正可以執行的單個SP。 – shenku 2012-04-05 03:26:02

1

然後,它聽起來像你想要使用varchar(max)列,並有一個單獨的表的參數..如果你使用參數你應該是安全的SQL注入。見下面匆匆的C#示例:

C#僞代碼示例

SQLCommand command = new SQLCommand("select * from myScripts where scriptid = @scriptid"); 
SQLParameter param = new SQLParameter("@scriptid", 12, int); 

...new SQLCommand("select * from myParams where scriptid = @scriptid"); 
...new SQLParameter... 

DataReader dr = new blah blah... 

SQLCommand userCommand = new SQLCommand(dr['sql']); 

foreach (parameter in params) 
{ 
    userCommand.Parameter.Add(parameter['name'], value); 
} 

userCommand.Execute... 
0

有沒有辦法 「清洗」 的腳本。
保護您的代碼的唯一方法是將代碼與數據分開。僅「清理」數據。

這就是爲什麼我們的代碼與數據分離。
代碼穩固且安全,數據可變,可以「清理」數據。

正如你打破這一基本法律,將代碼視爲數據,無法保護它。

根據任務的完全不同尋常的判斷,我會說有一個合適的解決方案。
你只是選擇了錯誤的架構。因此,你最好再問一個問題,比如「我想處理相當複雜的元數據結構(結構和目的)」,你將得到一個合適的解決方案,它不需要存儲SQL代碼數據。

相關問題