最可靠方法是用 d+ 命令查视图定义,它直接返回可复用的原始 SQL;dv/dv+ 不提供定义字段,是 PostgreSQL 的明确设计;使用 d+ 须带 schema 名,否则可能查错或报错;pg_views 查询需注意字段名、权限及截断问题。

直接用 d+ 命令,不是 dv,也不是 pg_views 查询就完事——它最可靠、最常用,且能拿到可直接复用的原始 SQL。
为什么 dv 查不到视图定义?
dv(包括 dv+)只列出视图名、schema、owner 和 comment,从不输出定义 SQL。这是 PostgreSQL 的明确设计,不是你用错了参数或版本低。官方文档写得清清楚楚:dv+ 不提供 definition 字段,那是 d+ 的职责。
-
dv my_view→ 只显示名称和类型 -
dv+ my_view→ 多显示 owner 和注释,仍无 SQL - 误以为
dv+能翻屏看到定义,结果白找几分钟
d+ 怎么用才不出错?
必须带 schema 名(除非视图在 public 且当前 search_path 包含它),否则会报 Did not find any relation 或查到同名但不同 schema 的对象。
- 正确写法:
d+ public.my_view或d+ sales.revenue_summary - 错误写法:
d+ my_view(当视图不在默认 search_path 时失效) - 执行前可先确认:
\dn看 schema 列表,SHOW search_path;看当前路径 - 输出中 “View definition” 后那一整块就是原始
SELECT语句,含换行缩进,复制粘贴即可复用
SQL 方式查 pg_views.definition 的坑
适合脚本调用或无法进 psql 时用,但权限和字段名容易踩雷:
- 字段名是
viewname,不是tablename—— 写成WHERE tablename = 'xxx'永远查不到 - 必须指定
schemaname,SELECT definition FROM pg_views WHERE schemaname = 'sales' AND viewname = 'revenue_summary'; - 非 owner 用户可能返回空字符串(权限不足),而
d+会明确提示No privileges - 返回的是纯
SELECT部分,不含CREATE VIEW ... AS头尾,要拼完整建语句得自己补
定义被截断或显示乱码怎么办?
不是数据丢了,大概率是终端或 pager 设置问题:
- 先关掉分页:
\pset pager off,再跑d+ - 如果定义超长(比如嵌套 5 层视图 + 大量 CTE),
pg_views.definition字段本身是text类型,不会截断,但 psql 默认宽度可能折行错乱 - 极端情况(如定义里有不可见控制字符),可用
SELECT pg_get_viewdef('sales.revenue_summary'::regclass);—— 它返回格式化后的完整 SQL,但要求你对视图有SELECT权限,且 schema 在 search_path 中
真正麻烦的从来不是“怎么查”,而是查出来之后发现字段名对不上、表已重命名、或者 pg_depend 显示依赖了某个根本不存在的对象——那说明视图早断链了,定义还在,执行就报错。这时候光看定义没用,得顺藤摸瓜查依赖。










