DB Update#

我们在维护自定义服务器时, 经常会有修改数据库的需求. 通常业余开发者会直接登录数据库进行修改, 或是运行一些 SQL 脚本. 这种修改方式在长期维护时会面临下面几个问题:

  1. 不可重复: 你的脚本以前没问题. 但 Azerothcore 核心和数据库一更新, 你的脚本就报错了. 比如你添加了一些 NPC, 然后有一天将 world 数据库更新到最新, 这时你的修改都丢失了, 而此时再运行你的脚本就不能重现你以前的修改了.

  2. 不幂等: 第一次运行你的脚本没有问题, 但成功之后再运行就会出错了.

  3. 不可恢复: 当你对数据库进行修改之后, 无法将其回复到之前的状态. 很多的修改是仅仅是对某一些 row 进行修改, 而如果你恢复数据库的 snapshot 到之前的状态, 你其他的 row 和 table 也会被回滚, 这是我们不希望的.

  4. 可能会破坏现有数据: 有些更改比如你创建了一些新的 NPC, 它们的 ID 是 10000-20000 之间. 你第一次运行脚本的时候没有问题, 但有时候由于数据库更新, 官方也添加了一些落在这个 ID 范围的 NPC, 此时你再运行脚本就有可能破坏现有数据.

所以我创建了一个 acore_db_app.update 模块, 里面的每个子目录都是一个对数据库进行某些修改的业务逻辑. 这些业务逻辑代码会保障这个 Update 是 “可重复”, “幂等”, “可恢复”, “不会破坏现有数据” 的.

这个设计参考了 Azerothcore 使用 base data + update data 来管理数据库中的版本的方法. 在更新数据库时, automatic updater 会按照顺序执行 SQL, 最终得到的数据就不会错. 而我们的设计也是只要你按照顺序执行 acore_db_app.update 中的 update, 那么最终得到的数据就不会错.