2

我正在尝试在存在于具有相同名称的多个模式中的表上创建一个视图(或在每个模式中使用而不进行修改的视图)

create schema company_1;
create schema company_2;
...
CREATE TABLE company_1.orders
(
  id serial NOT NULL,
  amount real,
  paid real,
  CONSTRAINT orders_pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);

CREATE TABLE company_2.orders
(
  id serial NOT NULL,
  amount real,
  paid real,
  CONSTRAINT orders_pkey PRIMARY KEY (id )
)
WITH (
  OIDS=FALSE
);

....

在不为每个视图指定架构或指定当前架构的情况下创建表订单视图的正确方法是什么?

我需要但未能得到的是

CREATE OR REPLACE VIEW
public.full_orders AS
SELECT id, amount FROM orders;

或者

CREATE OR REPLACE VIEW
company_1.full_orders AS
-- company_2.full_orders AS
-- company_n.full_orders AS
SELECT id, amount FROM current_schema.orders;

使用 PostgreSQL 9.2.2

编辑:我去的方式:

CREATE VIEW company_1.full_orders AS
SELECT id, amount FROM company_1.orders;

在这里讨论的模式副本上,我这样做

FOR src_table IN 
   SELECT table_name 
   FROM information_schema.TABLES 
   WHERE table_schema = source_schema AND table_type = 'VIEW'
LOOP
    SELECT view_definition 
    FROM information_schema.views 
    WHERE table_name = src_table AND table_schema = source_schema INTO q;
    trg_table := target_schema||'.'||src_table;
    EXECUTE 'CREATE VIEW ' || trg_table || ' AS '||replace(q, source_schema, target_schema);
END LOOP;

仍在寻找更好的解决方案...

4

1 回答 1

2

用直截了当的观点是不可能的。该视图在创建时记录了基础表的身份,因此它不受稍后完成的架构设置的影响。

您可以使用使用动态 SQL 的集合返回函数来执行此操作,然后将其包装到视图中。但我认为这不是一个好的解决方案。

正如您一直在做的那样,我只会为视图创建准副本,并增强我的部署脚本以使它们全部保持最新。

于 2013-01-18T17:56:06.033 回答