如何阻止SELECT * 语句

简介: 原文:如何阻止SELECT * 语句我们每个人都知道是个不好的做法,但有时我们还是要这样做:我们执行SELECT * 语句。这个方法有很多弊端: 你从你的表里返回每个列,甚至后期加的列。想下如果你的查询里将来加上了VARCHAR(MAX)会发生什么…… 对于指定的查询,你不能定义覆盖非聚集索...
原文: 如何阻止SELECT * 语句

我们每个人都知道是个不好的做法,但有时我们还是要这样做:我们执行SELECT * 语句。这个方法有很多弊端:

  • 你从你的表里返回每个列,甚至后期加的列。想下如果你的查询里将来加上了VARCHAR(MAX)会发生什么……
  • 对于指定的查询,你不能定义覆盖非聚集索引来克服执行计划里的查找(lookup)运算符,因为你会在额外的索引里重复你的数据……

现在的问题是你如何阻止SELECT *语句?当然你可以进行代码审核,你可以提供最佳模式指导,但谁最终会留意这些?基本上没有人——很遗憾这就就是令人伤心的事实……

但有一个非常简单方法来阻止SELECT *语句,在表里用技术层面来解决。

这个问题的解决方法非常简单:在你的表定义上增加一个产生除零错误的的计算列。这个方法超简单,但却真正有效。我们来看下面的表定义:

 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

但另一方面如果你通过名称指定查询列,你不会反悔计算列,你的查询如愿正常执行:

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

很不错吧,是不是?

小结

在各个交流会上我经常提到:有时我们只是变得太复杂了!这个用计算列的方法非常简单——肯定需要表架构修改。但下次设计新表的时候,要记得用这个方法。

感谢关注!

参考文章:

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

目录
相关文章
|
8月前
|
SQL
|
6月前
|
SQL 关系型数据库 MySQL
第3章_基本select语句
第3章_基本select语句
44 0
|
3月前
|
SQL 测试技术 数据库
`SELECT ... FOR UPDATE` 语句是如何工作的?
`SELECT ... FOR UPDATE` 语句是如何工作的?
84 0
|
8月前
|
SQL 存储 数据库
SQL语句中,如何使用含有if....else...判断语句
SQL语句中,如何使用含有if....else...判断语句
45 0
|
10月前
|
SQL Oracle 关系型数据库
update时 单行子查询返回多个行 SQL 错误 [1427] 处理方案
我遇到此错误是在多表关联update的
435 0
|
11月前
|
SQL 存储 关系型数据库
03_基本的SELECT语句
03_基本的SELECT语句
66 0
|
11月前
|
SQL 存储 前端开发
第03章_基本的SELECT语句
第03章_基本的SELECT语句
201 1
|
12月前
|
SQL 关系型数据库 数据库
如何实现update select 语句
​ 这次的文章出现也是因为这样一个类似的需求,个人需要把一个30万行(后续会发文介绍常见的处理手段)的数据文件入库,同时需要将部分字段迁移到另一张表,两个表之间通过两个字段进行and匹配。
160 0
|
SQL 存储 关系型数据库
一条SQL更新语句是如何执行的?
大家好前面我们大概了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块。相信你还记得,一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块,最后到达存储引擎。那么,一条更新语句的执行流程又是怎样的呢?
一条SQL更新语句是如何执行的?
|
SQL 缓存 算法
写出好的Join语句,前提你得懂这些
因为驱动结果集越大,意味着需要循环的次数越多,也就是说在被驱动结果集上面所 需要执行的查询检索次数会越多。比如,当两个表(表 A 和 表 B) Join 的时候,如果表 A 通过 WHERE 条件过滤后有 10 条记录,而表 B 有 20 条记录。如果我们选择表 A 作为驱动表,也就是被驱动表的结果集为 20,那么我们通过 Join 条件对被驱动表(表 B)的比较过滤就会有 10 次。反之,如果我们选择表 B 作为驱动表,则需要有 20 次对表 A 的比较过滤。小贴士1:驱动表的定义:当进行多表连接查询时,1.指定了联接条件时,满足查询条件的记录行数少的表为驱动表,2.未指定联接条件时,行数少