Liquibase Stored Proc 的管理

Liquibase Stored Proc's management

我阅读了 liquibase 的最佳实践,专门用于管理存储过程:

Managing Stored Procedures: Try to maintain separate changelog for Stored Procedures and use runOnChange=”true”. This flag forces LiquiBase to check if the changeset was modified. If so, liquibase executes the change again.

"maintain separate changelog for stored procedures" 是什么意思?

我通常有一个链接到版本的变更日志目录。每个更新日志文件都包含在 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),我们可以控制过程和函数的创建顺序(如果使用另一个则很重要)。

如果添加新过程,则向 procedures.xml

添加新的 SQL 脚本和新的 changeSet

@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>