Navicat 无原生多任务依赖调度功能,需通过 ncli 命令行工具配合 Shell/PowerShell 脚本实现:利用退出码判断前序任务成败,控制后续执行;任务名、项目名、路径须严格匹配;定时执行需依赖系统级计划任务(如 Windows 任务计划程序、macOS launchd 或 Linux cron)。
Navicat 里没有原生的“多任务依赖调度”功能
navicat 本身不是工作流引擎,automated tasks(自动任务)只支持按时间触发或手动运行,不支持 a 任务成功后才触发 b、b 失败则跳过 c 这类依赖链。你看到的“调度先后顺序”,其实是靠人工控制执行时机或外部工具兜底。
用 Shell / PowerShell 脚本串联多个 ncli 命令实现依赖调度
Navicat 16+ 提供了命令行工具 ncli(Windows 下是 ncli.exe,macOS/Linux 是 ncli),它能调用已保存的连接、查询、备份等任务。关键在于:每个 ncli 命令返回标准退出码(0 表示成功,非 0 表示失败),脚本能据此决定是否继续。
- Windows 示例(
run_with_deps.bat):ncli --run-query "MyProject:ETL_Stage1" --connection "ProdDB" if %ERRORLEVEL% NEQ 0 exit /b %ERRORLEVEL% ncli --run-query "MyProject:ETL_Stage2" --connection "ProdDB" if %ERRORLEVEL% NEQ 0 exit /b %ERRORLEVEL% ncli --run-backup "MyProject:DailyBackup" --connection "ProdDB"
- macOS/Linux 示例(
run_with_deps.sh):ncli --run-query "MyProject:ETL_Stage1" --connection "ProdDB" || exit $? ncli --run-query "MyProject:ETL_Stage2" --connection "ProdDB" || exit $? ncli --run-backup "MyProject:DailyBackup" --connection "ProdDB"
- 注意:
"MyProject:ETL_Stage1"中的冒号前是 Navicat 项目名,后面是任务名,大小写和空格必须完全一致 -
ncli默认在后台静默执行,加--verbose可看日志,但会干扰退出码判断,调试时再加
任务命名和路径必须严格匹配,否则 ncli 直接报错退出
常见失败不是逻辑问题,而是路径/名称拼错:ncli 不做模糊匹配,找不到就返回 1,整个链就断了。
- 项目名 ≠ 文件名:Navicat 项目(
.ncx)可重命名,但项目内显示的名称以「文件 → 项目属性」里设置的Project Name为准 - 任务名区分类型:
--run-query找的是「查询」节点下的任务,--run-backup找的是「备份」节点下的任务,不能混用 - 路径含空格或中文?必须用英文引号包裹全路径,比如:
ncli --project "/Users/me/Navicat Projects/数据平台.ncx" --run-query "ETL:Clean" - 查不到任务?打开 Navicat,右键该任务 → 「复制到剪贴板」→ 粘贴出来看真实名称(有时带不可见字符)
定时执行得靠系统级计划任务,Navicat 自身不接管调度周期
想每天凌晨 2 点跑依赖链?不能靠 Navicat 的「自动任务」时间设置——它只管单个任务,不管脚本。得把上面写好的 .bat 或 .sh 丢给操作系统调度。
- Windows:用「任务计划程序」新建基本任务,触发器设为「每天」,操作设为「启动程序」,程序填
cmd.exe,参数填/c "D:\scripts\run_with_deps.bat" - macOS:用
launchd(推荐),或crontab -e加一行:0 2 * * * /usr/local/bin/ncli --project "/path/to/project.ncx" --run-query "A" && /usr/local/bin/ncli --project "/path/to/project.ncx" --run-query "B"(注意 cron 环境变量缺失,ncli路径建议写绝对路径) - Linux:同上,但确保
ncli在PATH中,或直接写全路径如/opt/navicat/ncli - 别忘了给脚本加执行权限:
chmod +x run_with_deps.sh
真正的难点不在 Navicat 设置,而在让脚本稳定拿到正确上下文——项目路径、连接凭据、环境变量、错误传播粒度。这些没对齐,调度链看着漂亮,一跑就静默失败。











