执行脚本图

时间:2011-09-07 15:47:03

标签: sql language-agnostic graph-theory

我有一些(SQL)脚本。他们中的大多数都有一些要求:以前应该运行的其他脚本。

您可以将合并的依赖关系树想象为有向图。我希望能够“使图表中的某个节点无效”,从而产生一个复合脚本,其中包含应重新运行以达到就绪状态的所有内容(正确的顺序)。

我想起了像Debian启动过程......有点麻烦。

编辑:如果有人需要以 W 开头且以问号结尾的明确问题,我可以给出最接近的问题: 如何实现上述行为。

Edit2:理想的解决方案是扫描与模式匹配的文件,并从第一行(注释)行读取依赖关系信息。

3 个答案:

答案 0 :(得分:4)

你可以使用make。为戳文件创建命名约定(可能使用脚本中的日志文件)Makefile可以由脚本生成。 例如:

stamp1: stamp2 stamp3 script1.sql
     sql <script1.sql > $@

stamp2: stamp3 stamp5 script2.sql
     sql <script2.sql > $@

...

编辑: Makefile是有向非循环图。在上面的片段中,stamp1“依赖于”{stamp2,stamp3,script3.sql}:如果其中任何一个发生变化,它下面的行(sql&lt;&gt;)将被执行。因此,如果script1应始终在script2之后运行,则上述片段将适用。

答案 1 :(得分:2)

[抱歉,早先的回答不够通俗。现已修复]

您需要拓扑图表。见http://en.wikipedia.org/wiki/Topological_sorting,其中说:

  

拓扑排序的规范应用(拓扑顺序)   正在安排一系列工作或任务

定义了您的初始构建顺序以及如何从任何中间的,无效的点重新启动(只需在排序列表中找到该点并从那里开始)。

您还可以对无效点可到达的子图进行排序,这在某些情况下会减少点数(您可以避免重建原始排序上可能与无效节点“并行”构建的点及其子节点)(从一个点找到子图只需从那里进行广度优先搜索)。

ps因为订单必须相同,您只需过滤低于无效点的点的全局订单。换句话说,您不需要实际执行度假,只需从全局列表中的无效点开始,并跳过不在您的坏点下方的子图中的节点。

答案 2 :(得分:1)

您是否可以通过查找错误来使用“冒泡”订单的方法?我已经手动多次这样做了,并考虑过编写一个程序来自动化它:

给出类似的脚本列表L:

  1. 开始交易
  2. 设置i = 1
  3. 运行L [i]
  4. 如果错误将L [i]移动到L,回滚,转到1
  5. 的结尾
  6. 否则i = i + 1,转到3