【问题标题】:Update an existing trigger into Liquibase将现有触发器更新到 Liquibase
【发布时间】:2020-07-28 01:25:35
【问题描述】:

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

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

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

据我了解,我需要创建一个新的 changelog .XML 文件,然后将路径包含在另一个 post_migration 文件中。

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

谢谢!

【问题讨论】:

  • 你能添加触发器的代码和“你的”liquibase吗?它是如何配置的,又是如何调用的?

标签: sql database oracle liquibase


【解决方案1】:

我从来没有在 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) 文件是否已更改,并在需要时运行脚本。

【讨论】:

    【解决方案2】:

    所以,我相信您在本地开发人员数据库中创建/更新/替换 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 脚本而执行的规则。因此,结果可能要复杂得多。

    【讨论】:

    • 注意select .. into可以简化为::new.myid := seq_myseq.nextval;
    猜你喜欢
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2012-02-11
    相关资源
    最近更新 更多