PostgreSQL需用pg_views查视图名并拼接pg_dump --table命令导出;MySQL用information_schema.VIEWS拼SHOW CREATE VIEW,注意DEFINER问题;SQL Server用sys.views和OBJECT_DEFINITION提取DDL,需设TEXTSIZE防截断;跨库无真正通用方案,应按数据库类型分叉处理。

用 pg_dump 导出所有视图(PostgreSQL)
PostgreSQL 没有直接“只导出视图”的开关,但可以用 --schema-only + --table 配合 pg_views 动态生成命令。最稳的方式是先查出所有视图名,再拼成 pg_dump 命令:
psql -t -c "SELECT ' --table=' || schemaname || '.' || viewname FROM pg_views WHERE schemaname NOT IN ('pg_catalog', 'information_schema') ORDER BY schemaname, viewname;" mydb | tr '\n' '\0' | xargs -0 -I{} pg_dump --schema-only --no-owner --no-privileges -d mydb {} > views_backup.sql
注意:pg_dump 的 --table 参数必须写成 schemaname.viewname 格式,且不能带双引号(除非名字含大小写或特殊字符);-t 选项不支持通配符匹配视图,所以不能用 -t '*.*'。
SHOW CREATE VIEW 在 MySQL 中的局限性
MySQL 的 SHOW CREATE VIEW 只能单个视图执行,没法批量。想导出全部,得靠查询 information_schema.VIEWS 拼 SQL:
SELECT CONCAT('SHOW CREATE VIEW `', TABLE_SCHEMA, '`.`', TABLE_NAME, '`;')
FROM information_schema.VIEWS
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
然后把结果复制进客户端逐条执行——但有个坑:SHOW CREATE VIEW 输出里含 DEFINER,如果目标库用户不存在,还原时会报错 ERROR 1449 (HY000): The user specified as a definer ('xxx'@'%') does not exist。解决方法是导出后全局替换 DEFINER=`xxx`@`%` 为 DEFINER=CURRENT_USER,或加 --skip-definer(MySQL 8.0.26+)。
SQL Server 用 sys.views + OBJECT_DEFINITION 提取 DDL
SQL Server 没有内置导出脚本命令,得自己组合系统视图。关键点是:OBJECT_DEFINITION 返回的是 nvarchar(max),可能被 SSMS 截断(默认只显示前 4000 字符),必须提前设 SET TEXTSIZE 2147483647:
-
sys.views提供视图名和 schema,OBJECT_ID是关键关联字段 - 用
QUOTENAME包裹 schema 和 name,避免名字含空格或横线时报错 - 还原时若依赖基础表顺序,需按依赖关系排序(
sys.dm_exec_describe_first_result_set不适用,得用sys.sql_expression_dependencies)
简单导出语句示例:
SET TEXTSIZE 2147483647;
SELECT 'CREATE VIEW ' + QUOTENAME(s.name) + '.' + QUOTENAME(v.name) + ' AS ' + OBJECT_DEFINITION(v.object_id)
FROM sys.views v
JOIN sys.schemas s ON v.schema_id = s.schema_id
WHERE s.name NOT IN ('sys', ' INFORMATION_SCHEMA');
跨数据库通用做法:绕过工具,直接查 information_schema
所有主流数据库都支持 information_schema.VIEWS,但列名和内容差异大:VIEW_DEFINITION 在 PostgreSQL 里是 pg_get_viewdef(),MySQL 里是 VIEW_DEFINITION(但被转义为字符串,含换行和引号),SQL Server 则根本没这个字段。所以“通用脚本”本质是伪命题——真正可移植的只有两件事:
- 用标准 SQL 查出视图列表(
SELECT TABLE_SCHEMA, TABLE_NAME FROM information_schema.VIEWS) - 对每个结果,调用对应数据库的 DDL 提取函数,比如 PostgreSQL 用
pg_get_viewdef(oid),MySQL 用SHOW CREATE VIEW,SQL Server 用OBJECT_DEFINITION
自动化脚本一旦跨库,就得按数据库类型分叉处理,硬写成一个脚本只会埋下隐性兼容问题。实际备份时,不如明确环境、选对工具,比追求“一次编写到处运行”更省时间。

















