将现有触发器更新为liquibase

vmdwslir  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(352)

我对liquibase很陌生,我需要一些帮助。
我有一个现有的触发器没有捕获所有的数据;我对本地oracle数据库做了一些更改。现在我需要在liquibase中添加这些更改,但我不知道该怎么做。
我知道你不能在liquibase中直接更新原始的.xml文件来违反合同。
根据我的理解,我需要创建一个新的changelog.xml文件,然后在另一个post\u迁移文件中包含路径。
我的困惑是,我必须放弃原来的触发器,然后创建一个新的文件还是?
谢谢!

xmd2e60i

xmd2e60i1#

我从不在xml文件中创建触发器、过程甚至视图,因为这会使事情变得更复杂(我认为)。
我通常将实际的触发器定义移动到一个sql脚本中(在开发和测试期间也可以单独运行),然后在liquibase变更日志中包含该sql文件:

<changeSet id="42" author="arthur" runOnChange="true">
    <sqlFile path="triggers/some_trigger.sql" 
             stripComments="false"
             splitStatements="true"
             endDelimiter="/"
             relativeToChangelogFile="true"/>
</changeSet>

这个 some_trigger.sql 脚本与xml changelog一起存储在git(svn,…)中。这个 runOnChange="true" 是这里的“神奇成分”。您不必接触xml文件,只需编辑sql脚本。在部署期间,liquibase将检查(sql)文件是否已更改,如果需要,则运行脚本。

m528fe3b

m528fe3b2#

因此,我认为您应该在本地开发人员数据库中创建/更新/替换sql触发器,并且现在您希望将liquibase脚本包含到产品的发行发行发行包中。
liquibase不提供特殊的xml语法来创建触发器,因此您只需添加一个新的变更集,将pl/sql脚本保存在标记中。脚本将与您在本地数据库上运行的脚本相同。
示例代码如下:

<changeSet id="1" author="me">
    <sql endDelimiter="/">
        CREATE OR REPLACE TRIGGER trigger_name before insert
                on table1_name for each row
           BEGIN
                select seq_myseq.nextval
                      into :new.myid
                      from dual;
           END;
        /
    </sql>
</changeSet>

这段代码只是在调用liquibase update时编译目标数据库中的触发器。在大多数情况下,这就足够了。但我严格建议您向您的dba或团队负责人咨询您的团队在编写liquibase脚本时强制执行的规则。因此,结果可能要复杂得多。

相关问题