我想知道是否可以在 postgresql 中为表创建一个附加名称,以便可以通过其新别名或原始名称来引用该表?
就像为表添加视图一样,但是当您在“视图”上更新或插入时,它会写入基础表。
这样做的目的是能够重命名表而不必一次更新所有数据库客户端(没有停机时间)。
我想知道是否可以在 postgresql 中为表创建一个附加名称,以便可以通过其新别名或原始名称来引用该表?
就像为表添加视图一样,但是当您在“视图”上更新或插入时,它会写入基础表。
这样做的目的是能够重命名表而不必一次更新所有数据库客户端(没有停机时间)。
您可以使用 Postgres RULES 来执行此操作。
看看这篇文章。
@CraigRinger 提到了这个答案:
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');
似乎已成功执行,即使实际的 INSERT 语句original_table
由于唯一键违规而失败。