mysql、postgresql、sql server均需通过查询系统表+动态拼接获取视图ddl:mysql用information_schema.views的view_definition字段;postgresql用pg_views+pg_get_viewdef();sql server用sys.views+sys.sql_modules。

MySQL 中用 SHOW CREATE VIEW 批量获取视图定义
单个视图可用 SHOW CREATE VIEW view_name 查看建表语句,但没法直接批量导出所有视图。必须配合元数据查询动态拼接 SQL。关键点是:视图信息存在 INFORMATION_SCHEMA.VIEWS 表里,且 VIEW_DEFINITION 字段已包含完整 CREATE VIEW 语句(MySQL 5.7+ 默认开启 show_compatibility_56=OFF,否则该字段为空)。
执行以下查询可生成全部视图的建视图语句:
SELECT CONCAT('CREATE OR REPLACE VIEW `', TABLE_SCHEMA, '`.`', TABLE_NAME, '` AS ', VIEW_DEFINITION, ';') AS ddl
FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'sys');
注意:CONCAT 拼接时需手动加上 CREATE OR REPLACE VIEW 前缀和末尾分号——因为 VIEW_DEFINITION 只存 AS ... 后面的部分(MySQL 8.0.19+ 才支持直接查出完整语句)。
PostgreSQL 中用 pg_get_viewdef() 提取视图逻辑
PostgreSQL 不提供“一键导出所有视图 DDL”的内置命令,得靠系统目录 + 函数组合。核心是 pg_views 视图定位视图名与 schema,再用 pg_get_viewdef() 获取定义体。
推荐写法(兼容 9.6+):
SELECT 'CREATE OR REPLACE VIEW ' || schemaname || '.' || viewname || ' AS ' || pg_get_viewdef(schemaname || '.' || viewname) || ';' AS ddl
FROM pg_views
WHERE schemaname NOT IN ('pg_catalog', 'information_schema');
常见坑:
-
pg_get_viewdef()参数必须是'schema.name'格式字符串,不能只传viewname - 如果视图含复杂权限或依赖外部对象,导出的 DDL 不含
GRANT或COMMENT,需额外查pg_class/pg_description - 某些嵌套视图可能因依赖未解析而报错,加
AND definition IS NOT NULL过滤更稳妥
SQL Server 中用 sys.sql_modules 和 sys.views 关联提取
SQL Server 的视图定义存在 sys.sql_modules 表的 definition 字段中,需和 sys.views 关联才能拿到 schema 和 name。
最简可靠写法:
SELECT 'CREATE OR ALTER VIEW ' + s.name + '.' + v.name + ' AS ' + m.definition + ';'
FROM sys.views v
JOIN sys.schemas s ON v.schema_id = s.schema_id
JOIN sys.sql_modules m ON v.object_id = m.object_id
WHERE s.name NOT IN ('sys', 'INFORMATION_SCHEMA');
注意点:
- 用
CREATE OR ALTER VIEW而非CREATE VIEW,避免重复创建报错 -
sys.sql_modules.definition是nvarchar(max),导出时若用 SSMS 默认设置(结果转网格),可能截断长定义;务必右键结果 → “将结果另存为…” 选 UTF-8 编码文本文件 - 若视图含加密(
WITH ENCRYPTION),definition字段为空,无法导出
导出后必须检查的三个实际问题
无论哪种数据库,批量导出的 DDL 都不是“开箱即用”:
- 跨库引用没处理:比如
SELECT * FROM other_db.table,导到新环境会失败,得人工替换库名或补USE语句 - 权限和注释丢失:所有方案都只导逻辑定义,
GRANT SELECT ON view TO user、EXEC sys.sp_addextendedproperty等需单独提取 - 字符集/排序规则隐含差异:MySQL 导出的语句在目标库执行时,若
COLLATE不一致,可能报错,建议导出前确认源库默认COLLATION
真正要迁移视图,光有 DDL 远不够;先跑通定义,再补权限、再验逻辑,顺序不能乱。











