0

我正在开发一种工具,该工具允许用户和脚本(或代理)发布并查询众包数据库,前提是用户或脚本已存入信用。

查询命令允许代理指定任何 SQL SELECT 语句,服务器将执行该语句(使用 select-only sql 用户)并返回结果。服务器根据查询花费的时间以及返回的结果集的大小向代理收费。

我想使用 MySQL 5.7 的新 MAX_STATEMENT_TIME ( http://mysqlserverteam.com/server-side-select-statement-timeouts/ ) 根据代理指定的最大时间成本来限制查询的执行。但是,代理可以简单地将 MAX_STATEMENT_TIME 设置为查询中他们喜欢的任何内容,这将覆盖服务器在执行查询之前设置的任何内容。

虽然它散发出半生不熟的解决方案的味道,但我正在考虑简单地扫描提供的查询并拒绝使用 MAX_STATEMENT_TIME 关键字运行任何查询。这样,服务器理论上可以运行用户指定的 SELECT 查询,同时保证其设置的 MAX_STATEMENT_TIME 将被遵守。

所以,我的问题的第一部分是:这是个好主意吗?我错过了什么重要的东西吗?

我的问题的第二部分更笼统。考虑到我可以限制它们的执行时间,在使用仅限 SELECT 的 sql 用户运行用户指定的 SELECT 查询时是否存在一些巨大的、明显的缺陷?

4

1 回答 1

0

为什么不在cnf文件中设置最大值?

--maximum-max_statement_time=30

或者任何你想要的最大值。如果用户确实设置了一个值,则不能超过该值。从手册:

如果您想限制系统变量在运行时可以使用 SET 语句设置的最大值,您可以在服务器启动时使用 --maximum-var_name=value 形式的选项指定此最大值。例如,要防止 query_cache_size 的值在运行时增加到超过 32MB,请使用选项 --maximum-query_cache_size=32M。

(但是我同意 colosis 的评论,即您应该包含某种 API、REST 或其他,因为这将最大限度地减少潜在问题。)

于 2014-09-02T01:35:53.337 回答