如何阻止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/

目录
相关文章
|
存储 网络协议 虚拟化
如何操作VMware ESXi虚拟机的迁移?
如何操作VMware ESXi虚拟机的迁移?
|
1天前
|
JSON 定位技术 PHP
PHP技巧:解析JSON及提取数据
这就是在PHP世界里探索JSON数据的艺术。这场狩猎不仅仅是为了获得数据,而是一种透彻理解数据结构的行动,让数据在你的编码海洋中畅游。通过这次冒险,你已经掌握了打开数据宝箱的钥匙。紧握它,让你在编程世界中随心所欲地航行。
97 67
|
存储 计算机视觉
10位和16位YUV视频格式
10位和16位YUV视频格式
313 0
|
测试技术
JMeter 随机数生成器详细指南:利用 Random 和 UUID 实现
在压力测试中,经常需要生成随机值来模拟用户行为。JMeter 提供了多种方式来生成随机值,本文来具体介绍一下。
|
运维
ETCD系列之一:简介
本文介绍etcd使用场景,工作原理。
76896 3
|
SQL 关系型数据库 MySQL
MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
MySQL执行SQL文件出现【Unknown collation ‘utf8mb4_0900_ai_ci‘】的解决方案
|
11月前
|
Ubuntu Linux 开发工具
Linux Vim最全面的教程
Linux Vim最全面的教程
607 0
|
存储 算法 C++
BackTrader 中文文档(二十八)(3)
BackTrader 中文文档(二十八)
138 0
|
API 开发者
1688API接口推荐:1688口令转换真实链接接口
1688平台的item_password接口用于将淘口令短链接转为商品链接。开发者需注册获取API key和secret,通过POST或GET请求接口,输入淘口令代码和参数,返回结果包含商品ID和详细链接。商品详情可进一步通过商品详情接口获取。注意遵守1688平台的规定和条款,确保合法使用API。
|
机器学习/深度学习 算法 图形学
【论文泛读】NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis
【论文泛读】NeRF: Representing Scenes as Neural Radiance Fields for View Synthesis

热门文章

最新文章

OSZAR »