我阅读了liquidbase的最佳实践,特别是管理存储过程的最佳实践:
管理存储过程:尝试为存储过程维护单独的更改日志,并使用runOnChange= " true "。此标志强制LiquiBase检查更改集是否被修改。如果是,liquibase将再次执行更改。
"为存储过程维护单独的变更日志"是什么意思?
我通常有一个链接到版本的变更日志目录。每个变更日志文件都包含在master.xml
.
当遵循他们的建议时,目录结构应该是什么?
我们做的是这样的:
---liquibase
| changelog.xml
| procedures.xml
|
+---procedures
procedure_one.sql
procedure_two.sql
changelog.xml
简单地包括procedures.xml
。在procedures.xml
中,我们有这样的内容:
<changeSet author="arthur" id="1" runOnChange="true" runInTransaction="true">
<sqlFile path="procedures/procedure_one.sql"
encoding="UTF-8"
relativeToChangelogFile="true"
endDelimiter=";"
splitStatements="true"/>
</changeSet>
<changeSet author="arthur" id="2" runOnChange="true" runInTransaction="true">
<sqlFile path="procedures/procedure_two.sql"
encoding="UTF-8"
relativeToChangelogFile="true"
endDelimiter=";"
splitStatements="true"/>
</changeSet>
当然,runInTransaction="true"
只有在DBMS支持事务性DDL时才有意义。过程的每个SQL脚本都是自包含的,并使用create or replace
重新创建过程。对于不支持create or replace
的DBMS,我们通常在那里做一个(有条件的)drop procedure; create procedure ...
。
通过显式地包含文件(而不是使用includeAll
),我们可以控制创建过程和函数的顺序(如果一个使用另一个,这一点很重要)。
如果您添加一个新的过程,您将添加一个新的SQL脚本和一个新的changeSet到procedures.xml
@a_horse_with_no_name答案正确,以及你也检查你的版本,我错过了。我在补充他漏掉的东西。
这里有一个示例程序文件(procedure_one.sql),你可以直接使用。
CREATE PROCEDURE `ivi_alter_column`()
BEGIN
DECLARE CONTINUE HANDLER FOR SQLEXCEPTION BEGIN END;
ALTER TABLE `tableName` ADD COLUMN `columnName` BIGINT(20) NULL;
END;
procedures.xml看起来像这样
<changeSet id="alter_column_version_1" author="auther" dbms="mysql" runInTransaction="true">
<createProcedure dbms="mysql" encoding="UTF-8"
path="../changelog/procedures/procedure_one.sql"
procedureName="sample_alter_procedure" relativeToChangelogFile="true">
</createProcedure>
// Make sure You are calling
<sql>call sample_alter_procedure() </sql>
// then dropping procedure also
<dropProcedure procedureName="sample_alter_procedure" />
</changeSet>