Spring Boot项目中如何在Liquibase内正确删除存储过程?
好问题!先直接给你答案:不会自动删除对应的存储过程,也不会更新相关表。
为什么不会自动删除?
Liquibase的核心逻辑是基于**变更日志(changelog)**追踪数据库变更,它不会主动扫描你的SQL文件目录、判断哪些文件被删除,进而自动执行反向操作。它只会严格按照changelog文件里定义的变更集(changeSet)执行——只要某个变更集已经被标记为执行过(记录在数据库的databasechangelog表中),哪怕你删除了对应的SQL文件,Liquibase也不会再对这个变更做任何处理,更不会自动删除已创建的存储过程。
正确删除存储过程的方式
要删除prc_existing_to_be_deleted.sql对应的存储过程,你需要主动添加新的变更集来执行删除操作,步骤如下:
创建删除存储过程的SQL文件
在db/changes/sql/目录下新建一个SQL文件,比如drop_prc_existing_to_be_deleted.sql,内容为:DROP PROCEDURE IF EXISTS prc_existing_to_be_deleted;(
IF EXISTS是为了避免存储过程不存在时抛出错误)更新存储过程变更日志文件
编辑db/changes/stored-procs-changelog.xml,添加一个新的变更集,引用上面的删除SQL文件:<changeSet id="drop-proc-existing-to-be-deleted" author="your-name"> <sqlFile path="db/changes/sql/drop_prc_existing_to_be_deleted.sql" relativeToChangelogFile="true"/> </changeSet>也可以直接在变更集里写SQL语句,不用单独文件:
<changeSet id="drop-proc-existing-to-be-deleted" author="your-name"> <sql>DROP PROCEDURE IF EXISTS prc_existing_to_be_deleted;</sql> </changeSet>确认主变更日志的引用
确保db/changelog.xml里已经正确引入了stored-procs-changelog.xml(如果之前已经配置过就不用改动):<include file="db/changes/stored-procs-changelog.xml" relativeToChangelogFile="true"/>重新运行Spring Boot应用
启动应用后,Liquibase会检测到新的变更集,执行里面的删除语句,把目标存储过程从数据库中移除。(可选)清理旧文件
变更执行成功后,你就可以安全删除原来的prc_existing_to_be_deleted.sql文件了——对应的创建变更集已经执行过,删除文件不会影响已有的数据库状态。
额外提醒
- 每个变更集的
id和author要保证唯一,Liquibase靠这两个字段加文件路径识别变更是否已执行。 - 如果需要回滚操作,可以在变更集里添加
rollback标签,比如回滚时重新创建存储过程:<changeSet id="drop-proc-existing-to-be-deleted" author="your-name"> <sql>DROP PROCEDURE IF EXISTS prc_existing_to_be_deleted;</sql> <rollback> <sqlFile path="db/changes/sql/prc_existing_to_be_deleted.sql" relativeToChangelogFile="true"/> </rollback> </changeSet>
内容的提问来源于stack exchange,提问作者kaushalpranav

