在企業裡,使用 Stored Procedure (以下簡稱 SP) 相當尋常,常常會看到有為數不少的 SP 在資料庫裡頭,而這些 SP 裡面的 T-SQL 內容是各式各樣,相信有許多朋友見過的 SP 一定是比我還要多,早期有些企業因為要避免過多的 SQL Statement 在程式中出現,所以會將程式中所需要執行操作的 SQL Statement 給移到資料庫裡然後建立 SP,然後再讓程式透過 ADO.NET 或是其他方式來執行,還有一種就是某些資料的存取有一定的規則,而這些為了要統一管理這些規則而避免各個系統有自己一套的處理方式,所以會把資料存取的方式給統一建立 SP,然後各系統在去透過這些 SP 來存取資料,另外還有的就是有些資料的存取是必須要在資料庫裡頭來做,所以建立 SP 來做處理,當然還有很多其他的原因。
現在很多企業很少有專責的 DBA 來管理資料庫(其實在我的工作經歷中,也只有一家公司有這樣的編制也真的有這麼一位 DBA),大多是程式設計師也必須要兼任 DBA 的角色,也因為如此,很多個開發人員也都可以使用到公司裡的資料庫們,這樣也導致一個 DB 中的 SP 會有很多開發人員去使用與維護,經常發生的就是原本運作好好的 SP 會突然無法正常使用,這樣的狀況很多都是 SP 被別人做了修改,而另一種情況就是 DB 裡有多個 SP 的內容都是做一樣的事情,但卻會有很多分身,然後名稱都不同但有很類似,甚至於有些 SP 的內容看起來已經是沒有在使用了,但又不感冒然移除,深怕移除之後讓某個古董級系統產生異常而無法運作。
以上這些都是目前很多企業在使用 SP 的現狀,SP 的內容也是程式,但偏偏很少有去做管理或是做版本控制,導致 DB 內的 SP 隨著時間的推移而越來越多,等到哪一天資料庫要更新版本或是出了狀況時,這些 SP 就讓人相當頭大。
一開始就說了一堆看似與主題無關的內容,但也說明了過多以及過度使用 SP 對於系統開發的影響,我個人是不反對使用 SP,因為有些資料的處理並不適合放在程式中,但我反對過多的商業邏輯放在 SP 裡面去處理,每個系統的商業邏輯不盡相同,所以就必須將商業邏輯給放在個系統的程式裡做處理,在需求變動的情況下,也只要去修改系統的程式即可。
而已經使用 Entity Framework 開發的系統通常很少會再去跟資料庫裡的 SP 打交道,但是有時候是無法避免要跟 SP 做接觸,此時就必須要學習怎麼透過 Entity Framework 去跟這些 SP 溝通。