如何按依赖顺序删除和创建 postgresql 视图?

mhe*_*xon 3 postgresql postgresql-9.4

我发现以下/sf/answers/679843601/这很好,但对我来说仍然太多体力劳动。我需要以正确的顺序重新创建视图我将如何去做?

@dbenhur 谈到以下内容:

为了更完整,人们可以弄清楚如何查询哪些视图取决于您正在修改的表,并使用该查询而不是枚举视图名称。需要了解 pg_rewrite | pg_rule 来做到这一点,我认为

我不确定这到底是什么意思,但我会告诉你我需要,你告诉我是否可能。

我在一个 rails 应用程序中工作,我试图在其中维护视图和函数作为 rails 迁移的一部分,不幸的是这变得一团糟,我将我们的视图和函数转储到单独的文件中。在我看来,有两种前进的方式。我可以为这些使用单个文件,这使得它很麻烦,但我想 DDL 的顺序将由 pg_dump 管理。

或者,当我转储视图和函数时,我也可以查询并创建一个依赖树,稍后我会用它来重新创建它们。原因是手动更改视图中的列名变得太复杂了。

其他人如何维护他们的 DDL?有人做过我想做的事吗?

n3k*_*3ko 6

您可以查看“删除表基础级联”。之后,您必须自己重新创建结构。我认为这是更简单的方法。或者您可以扩展答案,您在 pg_depend 表中进行了一些搜索。对于“干净”方法,请检查文档,因为这里是一个查询:

WITH RECURSIVE t AS (
  SELECT c.oid,c.relname, 0 as level FROM pg_class c where relname='base' UNION ALL
  SELECT c.oid,c.relname, a.level+1 FROM t a
  JOIN pg_depend d ON d.refobjid=a.oid
  JOIN pg_rewrite w ON w.oid= d.objid AND w.ev_class!=a.oid
  JOIN pg_class c ON c.oid=w.ev_class
) SELECT distinct * FROM t order by level;
Run Code Online (Sandbox Code Playgroud)

  • 使用级联删除生产表似乎是一个糟糕的主意? (3认同)