尽管我的解决方案中没有SQL脚本,但Liquibase Update Command不会从数据库中删除元素表,函数,过程...

问题描述

我使用liquibase工具来管理一个postgres数据库。我的工作如下:

我有一个由不同文件夹组成的解决方案,其中包含负责模式创建,表创建,类型创建,过程创建等的sql脚本。然后,我有一个xml格式的ChangeLog文件,其中包含以下信息:>

includeAll路径=“#{Server.WorkingDirectory}#/ 02-架构” relativetochangelogFile =“ false”

includeAll路径=“#{Server.WorkingDirectory}#/ 03-类型” relativetochangelogFile =“ false

includeAll路径=“#{Server.WorkingDirectory}#/ 04-表” relativetochangelogFile =“ false”

includeAll路径=“#{Server.WorkingDirectory}#/ 05-功能” relativetochangelogFile =“ false”

includeAll路径=“#{Server.WorkingDirectory}#/ 06-存储过程” relativetochangelogFile =“ false”

我通过命令行运行liquibase:

liquibase --changeLogFile = $(Changelog.File.Name)--driver = $(Driver.Name)--classpath = $(Driver.Classpath)--url = $(BDD.URL)- -username = $(BDD.Passin)--password = $(BDD.Password)更新

这使Liquibase能够获取changelogFile中列出的不同文件夹中的所有sql脚本,将其与URL $ {BDD.URL)上的当前数据库进行比较,并生成包含要执行的所有SQL查询的增量脚本。有一个与我的解决方案相对应的数据库

当我添加新脚本(新表或过程)或修改现有脚本时,按预期,我的数据库已通过命令行正确更新,因此效果很好。但是,当我从解决方案中删除脚本时,它什么也没做。 更加真实,这就是我想要的:

  1. 我有一个sql文件,该文件包含位于文件夹“ 04-Tables”中的查询 CREATE TABLE my_table ”。

  2. 我执行上面的 update 命令,它在数据库中创建表“ my_table”。

  3. 我终于不再希望该表出现在数据库中。因此,我想简单地从解决方案中删除相应的sql脚本,然后再次运行“ update ”命令以简单地删除数据库中的表,并自动生成 DROP TABLE my_table” ”由liquibase的“ 更新”命令执行。但这不起作用,因为在删除sql文件时,Liquibase不会记录任何更改(而在添加修改文件时,它却不会记录任何更改)。

有人知道解决方案吗?在sql解决方案中没有针对该元素的“ 创建查询时,是否有特定的命令来删除该元素?

在此先感谢您的帮助:)

解决方法

您将需要显式编写脚本以删除表。 如果您已将回滚SQL指定为原始SQL脚本的一部分,则可以选择回滚更改。

有一个Pro版本选项可以回滚单个更新,具有免费/社区版本,您可以按顺序回滚最近的一些更改

ex;我执行过“ liquibase rollbackCount 5”将回滚仅在我已对作为脚本一部分所需的回滚sql进行编码的情况下才应用的最后5个更改。

包含要回滚的代码的我的Sql脚本示例是

-回滚删除表test.user1;删除表test.cd_activity;

创建表test.user1( user_type_id int NOT NULL ); 创建表test.cd_activity( activity_id整数NOT NULL userid int);