【问题标题】:debian recover fail from postinst scriptdebian 从 postinst 脚本恢复失败
【发布时间】:2014-07-26 00:00:16
【问题描述】:

我有点卡在 Ubuntu 的 postinst 文件中。 问题是在升级包时。我有一些 sqlite 数据库(标记为配置文件以将它们从升级中保存),我想在其中修改特定版本(添加一些列)。因为我只想在安装特定版本时修改数据库(例如从版本 3 或更早版本到 4),所以我检查 $2 是否不为空。

数据库升级方法如下:

  • 首先我备份数据库
  • 制作新表
  • 然后我修改表格
  • 将旧表中的行复制到新表中

问题是如果出现问题,数据库已经被修改,但包将是新版本(四个),配置版本为 3。如果我想尝试再次安装包以获取package ok,postinst 会失败,因为数据库已经被修改过。 我想到的一件事是 unset -e,但我觉得这很不愉快。

我已经在文档中搜索了有关如何从 postinst 恢复失败的信息,例如它是否被称为具有不同参数的另一个脚本,但在文档中 Debian 没有说任何有用的信息。 也许 postinst 脚本不是修改数据库的最佳位置?

谢谢

最好的问候

【问题讨论】:

    标签: bash debian dpkg


    【解决方案1】:

    您可以做的一件事是检查该字段是否已存在于表中,并在这种情况下进行更改。 这不取决于这是否是升级。

    例如这样:

    if sqlite3 /collection.db '.schema media' | grep -q 'new_field text' ; then
      echo field already exists, continuing
    else
      sqlite3 /collection.db 'alter table media add column new_field text'
    fi
    

    另外,我建议由应用程序操作数据库模式,而不是 dpkg。 想象一下,用户可能会从旧版本恢复备份并“破坏”您的软件。 用户应该清楚旧版本的数据库与新版本的不兼容。

    我建议您在互联网上搜索有关创建“迁移计划”的帮助。 基本上,这意味着您跟踪数据库的“版本”,并在需要时按顺序应用数据库修改,其方式与补丁的工作方式非常相似。

    【讨论】:

      猜你喜欢
      • 2013-01-19
      • 1970-01-01
      • 2016-03-22
      • 1970-01-01
      • 2021-12-18
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2015-06-05
      相关资源
      最近更新 更多