2012-10-06 19 views
0

我想知道是否可以在postgresql中为表创建一个附加名称,以便可以通过其新别名或原始名称引用表?别名表(读/写视图)

与为表添加视图相似,但在更新或插入'视图'时写入基础表。

这样做的目的是能够重命名表而不必一次更新所有数据库客户端(无需停机)。

回答

1

你可以使用Postgres RULES来做到这一点。

结账this文章。

+2

对于Pg9.1及以上版本,尽可能优先使用视图触发器。这是*方式更容易得到正确的。 –

+0

@CraigRinger我尝试了这里描述的视图触发器: http://www.depesz.com/2010/10/16/waiting-for-9-1-triggers-on-views/ 但是,例如,插入失败,错误不会传播到客户端。 – EoghanM

+0

@WillHartung Craig Ringer指出,这些规则实际上非常复杂,尤其是您需要在UPDATE上有WHERE子句来挑选主键......如果您正在应用的UPDATE语句有其他标准是什么?这对我来说太危险了,应该是一个简单的别名。 – EoghanM

0

@CraigRinger提到this answer

CREATE VIEW alias_as_view as SELECT * FROM original_table; 


CREATE FUNCTION write_to_underlying_table() RETURNS TRIGGER AS $$ 
BEGIN 
IF TG_OP = 'INSERT' then 
    raise notice 'INSERT trigger, NEW = [%]', NEW; 
ELSIF TG_OP = 'UPDATE' then 
    raise notice 'UPDATE trigger, OLD = [%], NEW = [%]', OLD, NEW; 
ELSE 
    raise notice 'DELETE trigger, OLD = [%]', OLD; 
END IF; 
RETURN NULL; 
END; 
$$ LANGUAGE plpgsql; 

CREATE TRIGGER view_writable_trigger INSTEAD OF INSERT OR UPDATE OR DELETE 
     ON alias_as_view FOR EACH ROW EXECUTE PROCEDURE write_to_underlying_table(); 

我已经拒绝了它的时刻,因为如一个失败的查询:

INSERT INTO alias_as_view VALUES ('existing_key', 'some_value'); 

似乎已经成功执行,即使在original_table实际INSERT语句失败,因为一个唯一键冲突。