确定SQL Insert / Update语句是否会影响存储的Select语句的结果

时间:2014-10-13 13:05:21

标签: sql

认为这是一个要求进行一些“头脑风暴”的好地方。如果它有点广泛/不受欢迎,请道歉。

我想知道这里是否有人对如何处理以下问题有任何想法:

首先假设我有一个select语句作为对象存储在某个地方(这可以是查询的树形式)。例如(为简单起见):

SELECT A, B FROM table_A WHERE A > 10;

很容易确定以下内容会改变上述查询的结果:

INSERT INTO table_A (A,B) VALUES (12,15);

但是,给定任何可能的Insert / Update / Whatever语句,以及任何可能的启动Select(但我们知道选择并且可以整天分析它们)我想确定它是否会影响Select Statement的结果。

可以假设不存在任何“外部”查询,并且我们知道所有发送到数据库的查询。我们还假设我们知道数据库架构。

不,这不适合做作业。只是一个脑筋急转弯,我一直在思考并开始陷入困境(显然,SQL会变得非常复杂。)

2 个答案:

答案 0 :(得分:1)

我的第一个想法是在table_A上设置触发器,如果​​您影响的任何列(在这种情况下为col A)发生变化以满足(或不再满足) )条件(> 10这里),然后触发器记录一个"影响"发生了变化。

E.g。还有另一个小表来记录"最后一次更新时间戳",触发器在检测到这种变化时可以弹出getdate()。

然后,您可以检查该表以查看自上次运行选择查询以来时间戳是否已更改 - 如果有,则表示您需要重新运行它,如果它没有,然后你知道结果是一样的。

该表可以包含许多这样的时间戳(每行一个,可能将表/触发器名称作为另一列中的键值)来为许多此类触发器提供服务。

优势?在表格的触发器中完成意味着没有可能影响错过选择语句的更改风险。

缺点?我想根据你的select语句的存在,你可能会在创建触发器时产生不良/无法管理的开销。

答案 1 :(得分:1)

根据对评论的回复,我说没有额外的标准,这种情况介于非常困难和不可能之间。

非常努力(至少,对我而言)因为你必须写一些东西来解析并将你的SQL语句解释为一个可行的参考框架,以实现你的目标。可行,但值得努力吗?

不可能,因为有些查询超越了像#34;拜占庭复杂的短语"。 (想想嵌套查询,相关子查询,视图,公用表表达式,触发器,外连接,以及谁知道全部。)没有设置标准,如"没有子查询,没有视图或触发器,不超过X加入&#34 ;等等,问题变得开放,足以保证NP完整答案。