Liquibase Stored Proc的管理



我阅读了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>

最新更新