T-SQL靜態代碼分析

 

靜態代碼分析,在Windows平臺上長期受到忽視,近幾年卻變得越來越重要。靜態分析重新獲得關注,始於一款Microsoft內部的工具—— FX Cop,由於它非常受歡迎,所以微軟將其公開發布。在Visual Studio 2005中,FX Cop作爲Visual Studio團隊開發版的一部分集成到該IDE中。

帶有附加功能或免除單元測試需要的第二代工具正在研發當中,包括.NET4的Code Contracts和自主研發的NStatic

託管代碼並不是唯一獲得關注的領域。Ubitsoft公司正對T-SQL應用相同的技術。隨着數據庫增長,封裝在T-SQL中的業務邏輯數量變化相當明顯,有時候甚至在重要性方面勝過普通代碼。要協助管理這一情況,Ubitsoft公司創建了SQL Enlight。我們就此和他們的開發主管Iliyan Stoyanov進行了溝通。

這是個相當新穎的產品,你可以給我們一些關於SQL Enlight如何誕生的背景嗎?

我們設計SQL Enlight作爲T-SQL管理和反射工具,但由於我們需要更多的時間來實現心中的所有想法,所以決定先發布T-SQL重格式化功能,稍後逐步來添加新功能。

你決定對Transact-SQL腳本分析提供支持是基於哪一點考慮呢?

從本項目開始,該分析功能就是我們其中一個目標,但我們決定推遲它的發佈,直到我們完成T-SQL語法分析器擴展爲止,它支持新的SQL Sever 2005 T-SQL語法。

你如何決定給分析添加哪些規則呢?

我們實現的分析規則基本上來自互聯網找到的提示和實踐,或者來自SQL Enlight用戶提交給我們的分析規則請求。

你們的技術支持提到過你正研發一個新版本,它會對整個數據庫進行分析。可以給我提供一些關於它的信息嗎?

是的。我們正研發新的1.6版本,它將是我們SQL Enlight1.x版本的里程碑。該新版本會包含兩項重要特性——創建自定義分析規則功能和支持在數據庫上運行分析。我們也打算包含命令行工具和MsBuild任務。

SQL Enlight當前版本支持這些分析規則。

設計

  • 包括NULL常量在內的相等和不等比較
  • 非ANSI外部聯接語法
  • 非ANSI內部聯接語法
  • 過時的語法,字符串_別名=表達式
  • 在執行數據操作語句(像INSERT/UPDATE/DELETE)之後,使用TRY..CATCH結構或者檢查該@@ERROR變量
  • 在存儲過程、視圖和表值函數中支持SELECT *
  • 使用SCOPE_IDENTITY()替換@@IDENTITY
  • 支持ORDER BY子句中使用常量已經過時
  • TOP子句用在不帶ORDER BY子句的查詢
  • 在INSERT語句中總是使用列的列表
  • 反對不帶WITH關鍵字的表提示用法
  • (聚集或非聚集)索引類型未指定
  • 避免使用GOTO語句來改善可讀性
  • 考慮使用括號來改善可讀性和避免由於邏輯操作符的優先級導致的錯誤。

命名

  • 在命名函數的時候避免使用“fn_”前綴
  • 在命名存儲過程的時候避免使用“sp_”前綴

性能

  • 變量@variable已聲明但從未使用
  • 變量@variable已使用但之前未分配
  • 變量@variable已分配但其值從未使用
  • 在LIKE謂詞中以“%”開始的模式
  • 考慮使用表變量來代替臨時表
  • 在觸發器中避免返回結果
  • 使用非常小的變量長度類型(大小爲1或者2)
  • 在存儲過程和觸發器中使用“SET NOCOUNT ON”選項
  • 在WHERE子句中避免使用不等操作符(<>,!=)
  • 本地遊標沒有關閉
  • 本地遊標無明確釋放
  • 本地遊標引用無明確釋放
  • 在WHERE子句的函數中避免封裝過濾列
  • 可以從WHERE子句中提取確定性函數調用,避免不必要的表掃描
  • 輸入參數從未使用
  • 輸出參數從未賦值
  • 在WHERE子句中避免使用“NOT IN”謂詞
  • 不要使用不帶聚合函數的“GROUP BY”子句

查看英文原文:Static Code Analysis for T-SQL

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章