问题描述
我使用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查询的增量脚本。有一个与我的解决方案相对应的数据库。
当我添加新脚本(新表或过程)或修改现有脚本时,按预期,我的数据库已通过命令行正确更新,因此效果很好。但是,当我从解决方案中删除脚本时,它什么也没做。 更加真实,这就是我想要的:
-
我有一个sql文件,该文件包含位于文件夹“ 04-Tables”中的查询“ CREATE TABLE my_table ”。
-
我执行上面的 update 命令,它在数据库中创建表“ my_table”。
-
我终于不再希望该表出现在数据库中。因此,我想简单地从解决方案中删除相应的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;