将现有触发器更新到 Liquibase

Update an existing trigger into Liquibase

我是 Liquibase 的新手,我需要一些帮助。

我有一个没有捕获所有数据的现有触发器;我对本地 Oracle 数据库进行了一些更改。现在我需要将这些更改添加到 Liquibase 中,但我不知道该怎么做。

我知道你不能通过直接更新原始 .xml 文件来违反 liquibase 中的合同。

根据我的理解,我需要创建一个新的变更日志 .XML 文件,然后将路径包含在另一个 post_migration 文件中。

我的困惑是,我是否必须删除原始触发器,然后创建一个新文件?

谢谢!

所以,我相信您 create/update/replace 本地开发人员数据库中的 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 更新时,此代码只是在目标数据库中编译触发器。在大多数情况下,这就足够了。但我强烈建议您向您的 DBA 或团队领导询问您的团队为编写 liquibase 脚本而强制执行的规则。因此,结果可能要复杂得多。

我从不在 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 更新日志一起存储在 git (svn, ...) 中。 runOnChange="true" 是这里的“神奇成分”。您不必触摸 XML 文件,您只需编辑 SQL 脚本。在部署期间,Liquibase 将检查 (SQL) 文件是否已更改,如果需要 运行 脚本