延迟 Table 视图中的名称解析

Delayed Table Name Resolution in View

我对 table 有看法。事实证明 table 被移动了,每晚都会创建一个更新版本。这确保了数据库中始终存在预期名称的 table,但我找不到使我的视图继续指向 table 的当前版本的方法。创建视图时存在的 table 是我最终指向的那个,即使它移动并变得陈旧。

视图A:

select a, b, c from todays_table;

todays_table 全天保持最新,然后在晚上重命名为 todays_table01。视图 A 现在指向 todays_table01,并且出现一个名为 todays_table 的新 table。同样,todays_table 是最新的,但 ViewA 不再是。

有没有办法延迟 table 名称解析,直到使用视图?我无法让 EXECUTE IMMEDIATESELECT 语句工作。我想如果我使用游标,我可以得到一个动态的 SQL 语句,但我以前从来不需要这些,我不确定它们是否是正确的路径。我阅读了有关 AUTO_REVAL 的信息,但我相信这只会延迟解决方案,直到第一次使用该视图并且当晚仍然过时。

当然,我可以停止使用视图并将复杂的查询移到我的程序中,但有很多地方需要它,所以我想在回退到这个之前消除所有其他解决方案。

消除临时 table 并让主 table 全天接收更新是最理想的,但这超出了我的理解范围,因为我对 RPG II 和 OCL 一无所知。

感谢阅读。

编辑 每@先生。在 Llama 的建议下,我尝试使用同义词和别名指向 todays_table,然后让我的观点指向同义词。不幸的是,在这种情况下,视图在创建时使用别名来解析实际的 table 名称,因此视图在重命名为 todays_table01 时继续指向 todays_table,尽管别名继续指向参考 todays_table

编辑 2 我接受@mustaccio 的回答,因为它确实有效,并且如果我能让参数到达他们需要的地方,这将是解决这个问题的合理方法。我的特定项目需要灵活性,所以我实际上要跳上夜间流程的潮流,并添加一个程序来在流程与他们的参考混淆后重新创建我的视图,如 @danny117 建议的那样。

感谢所有回复的人,我学到了很多关于所有这些部分如何协同工作的知识。

我认为您可以通过将视图定义包装在 SQL table 函数中来实现您想要的效果,例如

CREATE FUNCTION insteadofview (<parameters>)
RETURNS TABLE (<columns>)
...
RETURN
  SELECT <the rest of your view definition>

根据您查询视图的方式,您可能需要将搜索条件作为参数传递给函数,否则性能将不理想,因为函数在搜索之前必须 return 查询中的所有行可以应用参数。

According to the manual,正如您注意到重命名的 table 上的视图继续指向原始 table 对象 。但是,包括 table 函数在内的例程将失效,并在下次调用时再次准备它们的计划,使用原始来源 table name.

虽然我没有办法测试这个。

Full syntax to create a table function.