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