Navicat导出时视图/函数不显示,因对象类型需在「导出对象类型」页预先勾选(如Views、Functions),而非对象筛选器;权限不足或定界符兼容性问题也会导致失败,建议优先使用命令行工具精准导出。
Navicat 导出时对象筛选器不显示视图/函数?
默认情况下,navicat 的「对象筛选器」在导出向导中只列出表(tables),视图(views)、函数(functions)、存储过程(procedures)等不会直接出现——这不是你漏选了,而是 navicat 对不同对象类型做了分组隔离。
真正能勾选视图和函数的地方,不在「对象筛选器」主面板,而在上一步的「导出对象类型」选择页。必须先明确指定要导出哪类对象,后续才可能在筛选器里看到对应列表。
- 导出前务必点击「下一步」到第二步,找到
Object Types区域 - 勾选
Views、Functions、Procedures(按需),取消勾选Tables - 点「下一步」后,对象筛选器才会刷新并列出所有匹配的视图名、函数名
- 若仍为空,请确认当前连接用户有
SHOW VIEW和SELECT ROUTINE权限(MySQL)或对应USAGE权限(PostgreSQL)
导出函数时提示 “Access denied; you need (at least one of) the SUPER privilege”
这是 MySQL 环境下最常踩的坑:Navicat 默认用 SHOW CREATE FUNCTION 获取定义,而该语句要求 SUPER 权限(5.7+)或 SELECT 权限在 mysql.proc 表(旧版本)。普通账号通常没有。
绕过方法是改用 INFORMATION_SCHEMA 查询,但 Navicat 不提供开关。实际可行方案只有两个:
- 让 DBA 给账号授予临时
SELECT ON mysql.proc(MySQL 5.7 及更早)或SELECT ON mysql.routines(8.0+) - 改用命令行导出:
mysqldump --routines --no-create-info --no-data --skip-triggers your_db,再手动过滤掉表结构 - 注意:
--routines同时导出函数和存储过程,无法单独分离;如需仅函数,得靠后续文本处理
PostgreSQL 中函数导出为 SQL 但执行报错 syntax error at or near “$”
Navicat 对 PostgreSQL 函数导出时,会把原生的 $func$ 定界符替换成 $$,但某些版本(尤其是 12+)对美元符号定界符解析更严格,若函数体里本身含未转义的 $(比如正则表达式或动态 SQL 拼接),就会触发语法错误。
解决方式不是改 Navicat 设置,而是导出后手动校验:
- 打开导出的 SQL 文件,搜索
$$,确认每对定界符是否成对、嵌套是否合法 - 若函数含多层
$$,建议改用$xyz$形式(如$body$),并在导出前在数据库中先ALTER FUNCTION ... SET ...更新定义 - Navicat 无法识别自定义定界符名称,所以导出时一律扁平化为
$$—— 这是已知限制,不是 bug
备份脚本里混入了 SET NAMES / DELIMITER 等冗余语句
Navicat 导出的 SQL 脚本默认包含连接初始化语句(如 SET NAMES utf8mb4)和分隔符控制(DELIMITER $$),这些对纯恢复无害,但若你要把函数单独贴进其他环境或做 CI 集成,它们就成了噪音甚至冲突源。
导出时无法关闭这些头尾语句,只能事后清理或换策略:
- 勾选导出选项中的
Export each object as separate file,然后用 shell 或 Python 批量删首尾三行 - 对 MySQL,用
mysqldump --no-create-db --no-create-info --skip-triggers --routines --skip-extended-insert更干净 - 注意:
DELIMITER必须保留(否则函数体内的;会被误解析),但可统一替换为DELIMITER ;+ 函数体末尾加DELIMITER ;
视图和函数这类非数据对象的导出,核心矛盾在于:Navicat 的 UI 是为「整库迁移」设计的,不是为「对象级运维」优化的。真要高频做单对象备份,命令行工具反而更可控、更少意外。


















