存儲過程中高性能安全式SQL拼接


不少開發人員在進行SQL拼接時頭痛之極,不知道如何進行拼接操作才會更安全又不影響性能,下面我以存儲過程為例與大家分享一個相對比較安全高效的方法

簡介:存儲過程(Stored Procedure)是在大型數據庫系統中,一組為了完成特定功能的SQL 語句集,存儲在數據庫中,經過第一次編譯后再次調用不需要再次編譯,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。

格式
CREATE PROCEDURE [擁有者.]存儲過程名
[(參數#1,…參數#1024)]
[WITH
{RECOMPILE | ENCRYPTION | RECOMPILE, ENCRYPTION}
]
[FOR REPLICATION]
AS 程序行
其中存儲過程名不能超過128個字。每個存儲過程中最多設定1024個參數
(SQL Server 7.0以上版本),參數的使用方法如下:
@參數名數據類型[VARYING] [=內定值] [OUTPUT]
案例
    需求:1、查詢一張圖片表中前10筆圖片信息
    條件:1、按圖片類型(imgtype)添加人員編號(agentID)
       2、若圖片類型參數為空(NULL)查詢所有類型
       3、若添加人員參數為空(NULL)查詢所有人員
下面我們來分析一下我們經常使用的兩種不同寫法 會帶來什么樣的結果有什么樣的不足之處
寫法一:(不推薦)
優勢:一、閱讀或寫法簡單符合面向過程思路,大多數程序員都喜歡
不足:一、無法防止SQL注入問題;(防SQL注入核心方法:參數化)
   二、影響性能(這種寫法參數無法確定導致每次調用時都會重新編譯
   三、無法避免特殊符號的影響
 
寫法二:(不推薦)
  
優勢:1、代碼量少,閱讀簡單
   2、防止了SQL注入問題
不足:1、隱藏了一個定時炸彈(非常可怕的東西)
      1.1、當資料和參數為NULL時 查詢條件變成了 NULL=NULL,NULL=NULL真的成立嗎?
 
     現在大家應該明白原因了吧,此方法容易導致數據丟失(目前查詢中的資料顯示 NULL=NULL成立與否跟SQL服務器配置有關,對於這種時對時錯的方式最好不用,否則找問題你會后悔死的)
   2、大數據下此寫法性能非常低(丟失了索引鍵)
       2.1、使用存儲過程原因(1、提高性能,2、安全,3、邏輯業務.....)大數據下提高查詢性能(除硬件,架構..之外),建立索引是非常重要的但是寫法不同
會導致索引建丟失 分析一下:
      
反而這種寫法性能更高
寫法三:(推薦)
優勢:一、閱讀或寫法簡單符合面向過程思路,大多數程序員都喜歡
    二、參數化解決SQL注入問題
    三、一次編譯通過無需再次編譯
    四、利用了索引功能(提升性能)
    五、防止了特殊符號的影響


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM