为什么postgresql pg_dump将视图导出为表?


10

我正在使用PostgreSQL 9.3 pg_dump工具使用以下方法仅提取公共模式定义:

pg_dump -s -n public -h host -U postgres --dbname=db > ./schema.sql

但是当我检查schema.sql我们的一种观点时,它出现在CREATE TABLE声明中而不是CREATE VIEW声明中。

但是,如果我pg_dump使用以下特定视图:

pg_dump -s -t myview -h host -U postgres --dbname=db > ./schema.sql

然后schema.sql包含实际的视图定义。

那么,为什么会这样呢?感谢大伙们!

Answers:


12

在内部,视图只是具有规则的表,因此这很有意义。

看到这里:https : //postgresql.org/docs/9.5/static/rules-views.html

PostgreSQL中的视图是使用规则系统实现的。实际上,以下两者之间基本上没有区别:

CREATE VIEW myview AS SELECT * FROM mytab;

与两个命令相比:

CREATE TABLE myview (same column list as mytab);
CREATE RULE "_RETURN" AS ON SELECT TO myview DO INSTEAD
    SELECT * FROM mytab;

因为这正是CREATE VIEW命令在内部执行的操作。这有一些副作用。其中之一是,PostgreSQL系统目录中有关视图的信息与表中的信息完全相同。因此对于解析器来说,表和视图之间绝对没有区别。他们是同一回事:关系。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.