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

Lbe*_*ben 10 postgresql postgresql-9.3 pg-dump

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

pg_dump -s -n public -h host -U postgres --dbname=db > ./schema.sql
Run Code Online (Sandbox Code Playgroud)

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

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

pg_dump -s -t myview -h host -U postgres --dbname=db > ./schema.sql
Run Code Online (Sandbox Code Playgroud)

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

那么,为什么会发生这种情况?谢谢你们!

Max*_*phy 12

在内部,视图只是一个带有规则的表,所以这是有道理的。

请参阅此处:https : //postgresql.org/docs/9.5/static/rules-views.html

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

CREATE VIEW myview AS SELECT * FROM mytab;
Run Code Online (Sandbox Code Playgroud)

与两个命令进行比较:

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

因为这正是CREATE VIEW命令在内部所做的。这有一些副作用。其中之一是 PostgreSQL 系统目录中视图的信息与表的信息完全相同。所以对于解析器来说,表和视图之间绝对没有区别。它们是同一个东西:关系。