[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技术,收集整理相关文档撰写,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出此文连接!
若您以为这篇文章还不错请点击下右下角的推荐,有了您的支持才能激发做者更大的写做热情,很是感谢!

相关文章
相关标签/搜索