靜態(tài)代碼分析,在Windows平臺上長期受到忽視,近幾年卻變得越來越重要。靜態(tài)分析重新獲得關(guān)注,始于一款Microsoft內(nèi)部的工具—— FX Cop,由于它非常受歡迎,所以微軟將其公開發(fā)布。在Visual Studio 2005中,F(xiàn)X Cop作為Visual Studio團隊開發(fā)版的一部分集成到該IDE中。
帶有附加功能或免除單元測試需要的第二代工具正在研發(fā)當中,包括.NET4的Code Contracts和自主研發(fā)的NStatic。
托管代碼并不是唯一獲得關(guān)注的領(lǐng)域。Ubitsoft公司正對T-SQL應(yīng)用相同的技術(shù)。隨著數(shù)據(jù)庫增長,封裝在T-SQL中的業(yè)務(wù)邏輯數(shù)量變化相當明顯,有時候甚至在重要性方面勝過普通代碼。要協(xié)助管理這一情況,Ubitsoft公司創(chuàng)建了SQL Enlight。我們就此和他們的開發(fā)主管Iliyan Stoyanov進行了溝通。
這是個相當新穎的產(chǎn)品,你可以給我們一些關(guān)于SQL Enlight如何誕生的背景嗎?
我們設(shè)計SQL Enlight作為T-SQL管理和反射工具,但由于我們需要更多的時間來實現(xiàn)心中的所有想法,所以決定先發(fā)布T-SQL重格式化功能,稍后逐步來添加新功能。
你決定對Transact-SQL腳本分析提供支持是基于哪一點考慮呢?
從本項目開始,該分析功能就是我們其中一個目標,但我們決定推遲它的發(fā)布,直到我們完成T-SQL語法分析器擴展為止,它支持新的SQL Sever 2005 T-SQL語法。
你如何決定給分析添加哪些規(guī)則呢?
我們實現(xiàn)的分析規(guī)則基本上來自互聯(lián)網(wǎng)找到的提示和實踐,或者來自SQL Enlight用戶提交給我們的分析規(guī)則請求。
你們的技術(shù)支持提到過你正研發(fā)一個新版本,它會對整個數(shù)據(jù)庫進行分析??梢越o我提供一些關(guān)于它的信息嗎?
是的。我們正研發(fā)新的1.6版本,它將是我們SQL Enlight1.x版本的里程碑。該新版本會包含兩項重要特性——創(chuàng)建自定義分析規(guī)則功能和支持在數(shù)據(jù)庫上運行分析。我們也打算包含命令行工具和MsBuild任務(wù)。
SQL Enlight當前版本支持這些分析規(guī)則。
設(shè)計
- 包括NULL常量在內(nèi)的相等和不等比較
- 非ANSI外部聯(lián)接語法
- 非ANSI內(nèi)部聯(lián)接語法
- 過時的語法,字符串_別名=表達式
- 在執(zhí)行數(shù)據(jù)操作語句(像INSERT/UPDATE/DELETE)之后,使用TRY..CATCH結(jié)構(gòu)或者檢查該@@ERROR變量
- 在存儲過程、視圖和表值函數(shù)中支持SELECT *
- 使用SCOPE_IDENTITY()替換@@IDENTITY
- 支持ORDER BY子句中使用常量已經(jīng)過時
- TOP子句用在不帶ORDER BY子句的查詢
- 在INSERT語句中總是使用列的列表
- 反對不帶WITH關(guān)鍵字的表提示用法
- (聚集或非聚集)索引類型未指定
- 避免使用GOTO語句來改善可讀性
- 考慮使用括號來改善可讀性和避免由于邏輯操作符的優(yōu)先級導(dǎo)致的錯誤。
命名
- 在命名函數(shù)的時候避免使用“fn_”前綴
- 在命名存儲過程的時候避免使用“sp_”前綴
性能
- 變量@variable已聲明但從未使用
- 變量@variable已使用但之前未分配
- 變量@variable已分配但其值從未使用
- 在LIKE謂詞中以“%”開始的模式
- 考慮使用表變量來代替臨時表
- 在觸發(fā)器中避免返回結(jié)果
- 使用非常小的變量長度類型(大小為1或者2)
- 在存儲過程和觸發(fā)器中使用“SET NOCOUNT ON”選項
- 在WHERE子句中避免使用不等操作符(<>,!=)
- 本地游標沒有關(guān)閉
- 本地游標無明確釋放
- 本地游標引用無明確釋放
- 在WHERE子句的函數(shù)中避免封裝過濾列
- 可以從WHERE子句中提取確定性函數(shù)調(diào)用,避免不必要的表掃描
- 輸入?yún)?shù)從未使用
- 輸出參數(shù)從未賦值
- 在WHERE子句中避免使用“NOT IN”謂詞
- 不要使用不帶聚合函數(shù)的“GROUP BY”子句