如何让我的应用程序将列添加到 PostgreSQL 视图

How to make my application add column to a PostgreSQL view

我需要为我的应用程序找到一种向 PostgreSQL 视图添加列的方法。这需要动态完成,所以我不能对我的视图进行硬编码,而是我需要通过一些疯狂的 select 或类似的东西来获取它的实际代码。

我想通过调用一个 PostgreSQL 过程来实现这一点,该过程获取视图的创建脚本,删除它,然后使用新列重新创建它。问题是,我不知道如何获取视图的创建脚本。

我该怎么做,或者有其他方法可以做到吗?

我的应用程序使用 PHP 和 Zend Framework 2,我使用的是 Postgres 数据库。

编辑 1:我通过将原始 CREATE VIEW 脚本存储到一个变量中解决了我的问题,然后我循环到附加列中将它们添加到脚本中。

PostgreSQL 不存储视图的 "actual code"。也就是说,PostgreSQL 不存储 create view 语句。

您可以使用 create or replace view ... 在末尾添加列。但是您要么必须已经拥有列及其顺序,要么必须在 information_schema views or in the PostgreSQL system catalogs.

中查找所有信息

要替换视图,您必须是所有者,或者您必须是所有者角色的成员。


正如 pozs 指出的那样,有一组 pg_get_viewdef() 函数。他们没有 return 原始 create view 声明,但我非常有信心关键信息——列的名称和顺序——将允许您添加列 "at the end"。

这是我根据我的日历 table.

写给 运行 的实际 create view... 声明
create view weekdays as 
select cal_date, day_of_week
from calendar
where day_of_week in ('Mon', 'Tue', 'Wed', 'Thu', 'Fri');

这是我使用 pg_get_viewdef() 的方式。

select pg_get_viewdef(to_regclass('weekdays'));

这就是它return编辑的内容。

SELECT calendar.cal_date,
    calendar.day_of_week
   FROM calendar
  WHERE (calendar.day_of_week = ANY (ARRAY['Mon'::bpchar, 'Tue'::bpchar, 'Wed'::bpchar, 'Thu'::bpchar, 'Fri'::bpchar]));