我阅读了清算基地的最佳做法,特别是管理存储过程的最佳做法:
管理存储过程:尝试为存储过程维护单独的变更量,并使用runOnChange=“true”。此标志强制LiquiBase检查变更集是否已修改。如果是这样,液化库将再次执行更改。
他们所说的“为存储过程维护单独的变更量”是什么意思?
我通常有一个链接到版本的changelogs目录。每个changelog文件都包含在master.xml
中。
当遵循他们的建议时,目录结构会是什么?
发布于 2016-10-12 06:48:46
我们所做的是这样的:
\---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>
当然,只有当DBMS支持事务性DDL时,runInTransaction="true"
才有意义。
过程的每个SQL脚本都是自包含的,并使用create or replace
重新创建过程。对于不支持create or replace
的DBMS,我们通常在其中执行(条件) drop procedure; create procedure ...
。
通过显式地包含文件(而不是使用includeAll
),我们可以控制创建过程和函数的顺序(如果使用另一个过程和函数非常重要)。
如果添加新过程,则向changeSet添加一个新SQL脚本和一个新procedures.xml
。
发布于 2020-06-04 09:40:59
@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>
https://stackoverflow.com/questions/39989749
复制相似问题