SQL与安全网

时间:2008-08-18 23:58:11

标签: sql mysql

我的公司有一群才华横溢,聪明的操作人员,他们非常努力。我想给他们一个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。

7 个答案:

答案 0 :(得分:2)

如果您的员工正在使用mysql(1)程序来运行查询,您可以使用safe-updates选项(也称为i-am-a-dummy)来帮助您获得所需内容。它的名字有点误导;它不仅可以在没有WHERE(你不担心)的情况下阻止UPDATE和DELETE,还可以向SELECT语句添加隐式LIMIT 1000,并中止具有连接的SELECT,并且估计会考虑超过1,000,000个元组 - 非常适合令人沮丧的笛卡尔联盟。

答案 1 :(得分:1)

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

Danger Will Robinson!

Automate Automate Automate。

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

如果失败,给他们一个只有SELECT提交的用户ID可能会有所帮助: - )

答案 2 :(得分:0)

您可能会发现redgate的SQL Prompt很有用。我不确定你正在使用什么数据库引擎,因为它只适用于MSSQL Server

答案 3 :(得分:0)

我从一些编码标准开始 - 例如从不在你的例子中使用连接类型 - 它经常导致不良结果(特别是在SQL Server中,如果你尝试以这种方式进行外连接,你会变坏结果)。要求他们进行明确的连接。

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

您最好的选择可能是为文本编辑器编写一个插件,对可疑模式进行一些基本检查,并以与标准.sql模式不同的方式突出显示它们。但即便如此也是如此。

每当我在没有where子句的情况下输入更新语句时,我会很满意一个引发警钟的工具。并且可能会进行轻微的电击,因为经过漫长的一天,这样的错误通常会在早上1点左右发生。

答案 6 :(得分:0)

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

  1. 您可能会收到SQL语法错误,因为它是一个小型数据库,所以不会加载数据库。
  2. 您可能会收到一个明确显示包含一个或多个表中每一行的响应,这可能不是他们想要的。
  3. 通过上述条件的事情可能没问题,因此您可以针对生产数据库的副本运行它们。
  4. 假设您的架构没有太大变化并且不是特别奇怪,编写上述内容可能是解决问题的最快方法。