我想知道是否可以在postgresql中为表创建一个附加名称,以便可以通过其新别名或原始名称引用表?别名表(读/写视图)
与为表添加视图相似,但在更新或插入'视图'时写入基础表。
这样做的目的是能够重命名表而不必一次更新所有数据库客户端(无需停机)。
我想知道是否可以在postgresql中为表创建一个附加名称,以便可以通过其新别名或原始名称引用表?别名表(读/写视图)
与为表添加视图相似,但在更新或插入'视图'时写入基础表。
这样做的目的是能够重命名表而不必一次更新所有数据库客户端(无需停机)。
你可以使用Postgres RULES来做到这一点。
结账this文章。
@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语句失败,因为一个唯一键冲突。
对于Pg9.1及以上版本,尽可能优先使用视图触发器。这是*方式更容易得到正确的。 –
@CraigRinger我尝试了这里描述的视图触发器: http://www.depesz.com/2010/10/16/waiting-for-9-1-triggers-on-views/ 但是,例如,插入失败,错误不会传播到客户端。 – EoghanM
@WillHartung Craig Ringer指出,这些规则实际上非常复杂,尤其是您需要在UPDATE上有WHERE子句来挑选主键......如果您正在应用的UPDATE语句有其他标准是什么?这对我来说太危险了,应该是一个简单的别名。 – EoghanM