0

我的公司有一群才华横溢、聪明的运营人员,他们工作非常努力。我想给他们一个 SQL 执行工具,帮助他们避免常见的、容易检测到的 SQL 错误,这些错误在他们赶时间时很容易犯。任何人都可以建议这样的工具吗?详情如下。

运营团队的一部分职责是编写非常复杂的即席 SQL 查询。毫不奇怪,操作员有时会因为太忙而在编写查询时出错。

幸运的是,他们的查询都是 SELECT 而不是更改数据的 SQL,而且它们无论如何都在数据库的副本上运行。尽管如此,我们还是希望防止它们运行的​​ SQL 出现错误。例如,有时错误会导致长时间运行的查询减慢他们正在使用的重复系统并给其他人带来不便,直到我们找到罪魁祸首并杀死它。更糟糕的是,有时这些错误会导致我们直到很久以后才发现明显正确的答案,从而导致尴尬。

我们的开发人员在他们编写的复杂代码中也会犯错误,但他们有 Eclipse 和各种插件(例如FindBugs)可以在输入时捕获错误。我想给运营商类似的东西 - 理想情况下它会看到

SELECT U.NAME, C.NAME FROM USER U, COMPANY C WHERE U.NAME = 'ibell';

在你执行之前,它会说“嘿,你意识到这是一个笛卡尔积吗?你确定要这样做吗?” 它不必非常聪明——发现明显缺少连接条件和类似的明显错误就可以了。

看起来TOAD应该这样做,但我似乎无法找到有关此类功能的任何信息。有没有像 TOAD 这样的其他工具可以提供这种半智能纠错?

更新:我忘了提到我们正在使用 MySQL。

4

7 回答 7

2

如果您的人员使用 mysql(1) 程序来运行查询,您可以使用安全更新选项(又名 i-am-a-dummy)来获取您需要的部分内容。它的名字有些误导。它不仅可以防止没有 WHERE 的 UPDATE 和 DELETE(您不必担心),而且还向 SELECT 语句添加了一个隐式 LIMIT 1000,并中止具有连接且估计要考虑超过 1,000,000 个元组的 SELECT --- 非常适合不鼓励笛卡尔连接。

于 2008-08-19T03:10:41.253 回答
1

...“编写非常复杂的即席 SQL 查询......他们太忙了”

危险威尔罗宾逊!

自动化自动化自动化。

理想情况下,操作团队不应该被置于必须在高压力情况下即时编写查询的位置——这是灾难的根源!他们最好建立一个预先编写的脚本库,这些脚本已经过适当的测试,以确保它 a) 做你想做的 b) 提供审计跟踪 c) 具有可能的“撤消”类型功能。

如果做不到这一点,给他们一个只有 SELECT 权限的用户 ID 可能会有所帮助:-)

于 2008-08-21T08:04:21.603 回答
0

您可能会发现redgate 的SQL 提示很有用。我不确定您使用的是什么数据库引擎,因为它仅适用于 MSSQL Server

于 2008-08-19T00:05:24.873 回答
0

我不希望这样的事情存在。该工具必须首先实现数据库中 SQL 解析器实现的所有内容,然后必须进行数据模型分析以预测“坏”查询。

您最好的选择可能是为文本编辑器编写一个插件,该插件对可疑模式进行一些基本检查,并以不同于标准 .sql 模式的方式突出显示它们。但即使这样也相当困难。

每当我输入没有 where 子句的更新语句时,我会很高兴有一个工具会触发警钟。并且可能进行了轻微的电击,因为通常在经过漫长的一天之后的凌晨 1 点左右,就会发生类似的错误。

于 2008-08-19T02:42:37.053 回答
0

通过设置一个包含极少量虚拟数据的示例数据库来构建这个非常容易,该数据库将首先接收查询。会发生几件事:

  1. 您可能会收到一个 SQL 语法错误,因为它是一个小型数据库,所以它不会加载太多数据库。
  2. 您可能会收到一个响应,该响应可以清楚地显示包含一个或多个表中的每一行,这可能不是他们想要的。
  3. 通过上述条件的事情可能没问题,因此您可以针对生产数据库的副本运行它们。

假设您的架构没有太大变化并且不是特别奇怪,那么编写上述内容可能是解决您的问题的最快方法。

于 2008-08-19T02:48:05.043 回答
0

我将从一些编码标准开始 - 例如,永远不要在您的示例中使用连接类型 - 它通常会导致不好的结果(特别是在 SQL Server 中,如果您尝试以这种方式进行外部连接,您将得到不好的结果)。要求他们进行显式连接。

如果您有复杂的关系,您可以考虑将它们放在视图中,然后从视图中编写即席查询。那么至少他们永远不会犯错误的连接错误。

于 2009-01-05T20:28:28.463 回答
0

您不能只限制查询可以运行的时间吗?我不确定 MySQL,但对于 SQL Server,即使只是默认查询分析器也可以限制查询在超时之前运行的时间。再加上有限的权限,所以他们只能运行 SELECT 查询,你应该会被覆盖。

于 2009-01-05T20:35:32.490 回答