Skip to content

Repository files navigation

Oracle Schema Snapshot

Oracle 数据库结构快照与差异同步工具:采集 Schema 结构、离线对比差异、生成可审计的升级 SQL。

CI Release License

解决什么问题

ERP 实施 / 客户现场支持 / 多环境发布时,经常需要回答:

  • 客户库比标准版缺了哪些表、字段、索引、约束
  • 函数、存储过程、包、视图和标准版有哪些不同
  • 如何生成一份敢在生产库执行的升级脚本?

本工具的运行方式:

  Oracle 库 A ──采集──▶ 快照 A ─┐
                               ├──对比──▶ 差异报告 ──▶ upgrade_YYYYMMDD.sql / Excel
  Oracle 库 B ──采集──▶ 快照 B ─┘

不需要同时连接两个数据库:现场采集快照带回公司,与标准版离线对比即可。

功能特性

  • 结构采集:表(含注释/表空间)、字段、索引、约束、序列、视图、Function / Procedure / Package / Trigger 源码;自动过滤回收站(BIN$)与系统内部对象(SYS_IL LOB 索引等)
  • 两种对比模式:快照 VS 快照、快照 VS 在线数据库
  • 安全的升级脚本
    • 默认只生成 ADD / MODIFY;DROP 类需显式开启并独立成警告段
    • 破坏性修改(缩短长度 / 类型变更 / 收紧非空)自动附风险提示注释
    • 约束按逻辑签名匹配(主键两侧名字不同但定义相同不会误报)
    • 新建表按 Toad 风格成套输出:建表 + 注释 + 唯一索引 + USING INDEX 主键约束
    • 两侧 Schema 同名时对象自动带属主前缀(ERP.TEST_TABLE
    • 分节清晰:-- [TABLE] 表(n 项) 粗分隔线标题,TABLE / 字段 / 索引 / 约束 / 序列 / 视图 / 函数 / 存储过程 / 包 / 触发器 各自成节
  • 桌面 GUI(PyQt6):三页签工作流(生成快照 → 差异对比 → 升级 SQL),SQL 语法高亮、差异语义着色、Excel 导出
  • CLI:全部能力可脚本化,适合 CI / 巡检
  • OTA 更新:检查 GitHub Releases 新版本,下载后退出自动替换重启
  • Oracle 兼容:实测支持 11g(Thin 模式直连 11.2.0.4)/ 12c / 19c;11g 亦可勾选 Thick 模式

快速开始(Windows 免安装)

  1. Releases 下载 OracleSchemaTool-vX.Y.Z-win64.zip
  2. 解压后运行 OracleSchemaTool\OracleSchemaTool.exe
  3. 「生成快照」页签填写连接信息 → 生成快照;两侧各采一次
  4. 「差异对比」页签选择两个快照(或快照 VS 数据库)→ 开始对比
  5. 「升级 SQL」页签预览 / 导出 upgrade_日期.sql,或回到对比页导出 Excel

从源码构建

需要 uv 与 Python 3.11+:

uv sync                 # 安装依赖
uv run pytest -q        # 跑测试
uv run ruff check src tests
uv run dbsnapshot --help            # CLI
uv run dbsnapshot gui               # 启动 GUI
uv run pyinstaller --noconfirm --windowed --name OracleSchemaTool --collect-all oracledb exe_main.py
# 产物在 dist/OracleSchemaTool/

CLI 用法

# 采集快照(--pack 打包为单文件 .snapshot)
uv run dbsnapshot collect --host 10.0.0.10 --user erp --password xxx --schema ERP \
    --output ./snapshots --pack

# 对比两个快照,生成差异报告 JSON
uv run dbsnapshot compare 标准版.snapshot 客户库.snapshot -o diff.json

# 由报告生成升级脚本(DROP 类默认不生成)
uv run dbsnapshot generate diff.json -o ./output
uv run dbsnapshot generate diff.json --include-drop --include-tablespace

# 检查 OTA 更新
uv run dbsnapshot update

升级脚本安全规则

规则 说明
默认无 DROP DROP / 重建类语句默认只以注释展示,加 --include-drop 才真正输出
风险注释 缩短长度、类型变更、收紧非空等操作前附 -- !! 风险: 注释
约束逻辑匹配 按 (类型, 列组, 条件) 匹配约束,仅名称不同只提示不生成破坏性 SQL
NOT NULL 归一 "COL" IS NOT NULL 型 CHECK 归入列属性,不重复生成约束
属主前缀 仅两侧 Schema 同名时加前缀,避免异名环境生成错误 SQL
TABLESPACE 可选 默认不带,避免目标库无同名表空间报 ORA-00959

OTA 自动更新

  • GUI:菜单「帮助 → 检查更新」;CLI:dbsnapshot update
  • 流程:查询 GitHub 最新 Release → 版本比较 → 下载 zip → 生成替换脚本 → 退出程序后自动覆盖并重启
  • 仅打包版 exe 支持 OTA;源码运行请用 git pull

开发

src/dbsnapshot/
├── collector/     # Oracle 连接与元数据采集(表/字段/索引/约束/序列/视图/PL-SQL)
├── snapshot/      # 快照读写与 .snapshot 打包(加密可选)
├── diff/          # 差异引擎、差异模型、Excel 导出
├── sqlgen/        # DDL / PL-SQL 生成与升级脚本组装
├── gui/           # PyQt6 界面(主题、三页签、后台线程、SQL 高亮)
├── cli.py         # Typer 命令行
└── updater.py     # OTA 更新

测试不依赖真实数据库:tests/conftest.py 内置标准版 / 客户版两套 Schema 夹具,覆盖约束逻辑匹配、系统索引过滤、Toad 风格建表、属主前缀、Excel 导出等场景。

CI(push / PR)跑 ruff + pytest;CD(推送 v* tag)在 Windows 上 PyInstaller 打包并发布 Release 附件。

License

MIT

About

Oracle 数据库结构快照与差异同步工具:跨环境采集 Schema、离线对比差异、一键生成可审计的升级 SQL。带 GUI、Excel 报告、自动更新,DBA 发布变更的瑞士军刀。

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages