[sql server] 如何阻止SELECT * 語句

咱們每一個人都知道是個很差的作法,但有時咱們仍是要這樣作:咱們執行SELECT * 語句。這個方法有不少弊端:sql

  • 你從你的表裏返回每一個列,甚至後期加的列。想下若是你的查詢裏未來加上了VARCHAR(MAX)會發生什麼……
  • 對於指定的查詢,你不能定義覆蓋非彙集索引來克服執行計劃裏的查找(lookup)運算符,由於你會在額外的索引裏重複你的數據……

如今的問題是你如何阻止SELECT *語句?固然你能夠進行代碼審覈,你能夠提供最佳模式指導,但誰最終會留意這些?基本上沒有人——很遺憾這就就是使人傷心的事實……架構

但有一個很是簡單方法來阻止SELECT *語句,在表裏用技術層面來解決。ide

這個問題的解決方法很是簡單:在你的表定義上增長一個產生除零錯誤的的計算列。這個方法超簡單,但卻真正有效。咱們來看下面的表定義:post

複製代碼
 1 -- Create a simple table with a computed column that generates
 2 -- a divide by zero exception.
 3 CREATE TABLE Foo
 4 (
 5     Col1 INT IDENTITY(1, 1) NOT NULL PRIMARY KEY,
 6     Col2 CHAR(100) NOT NULL,
 7     Col3 CHAR(100) NOT NULL,
 8     DevelopersPain AS (1 / 0)
 9 )
10 GO
11 
12 -- Insert some test data
13 INSERT INTO Foo VALUES ('a', 'a'), ('b', 'b'), ('c', 'c')
14 GO
複製代碼

如你所見,我這裏增長了一個進行除零的計算列。這表示當是查詢這個列時,你會獲得一個錯誤信息——例如在SELECT * 語句裏:學習

1 -- A SELECT * statement doesn't work anymore, ouch...
2 SELECT * FROM Foo
3 GO

但另外一方面若是你經過名稱指定查詢列,你不會反悔計算列,你的查詢如願正常執行:spa

1 -- This SQL statement works
2 SELECT Col1, Col2, Col3 FROM Foo
3 GO

很不錯吧,是否是?設計

小結

在各個交流會上我常常提到:有時咱們只是變得太複雜了!這個用計算列的方法很是簡單——確定須要表架構修改。但下次設計新表的時候,要記得用這個方法。code

感謝關注!blog

參考文章:

www.sqlpassion.at/archive/2015/10/26/how-to-prevent-select-statements/索引

注:此文章爲WoodyTu學習MS SQL技術,收集整理相關文檔撰寫,歡迎轉載,但未經做者贊成必須保留此段聲明,且在文章頁面明顯位置給出此文連接!
若您以爲這篇文章還不錯請點擊下右下角的推薦,有了您的支持才能激發做者更大的寫做熱情,很是感謝!

相關文章
相關標籤/搜索