我是Liquibase的新人,我需要一些帮助。
我有一个没有捕获所有数据的现有触发器;我对本地Oracle数据库进行了一些更改。现在我需要将这些更改添加到Liquibase中,但我不知道如何做到这一点。
我知道您不能通过直接更新原始.xml文件来违反liquibase中的合同。
据我所知,我需要创建一个新的changelog .XML文件,然后包含另一个post_migration文件上的路径。
我的困惑是,我是必须删除原始触发器,然后创建一个新文件,还是?
谢谢!
发布于 2020-07-28 21:25:04
我从不在XML文件中创建触发器、过程甚至视图,因为这会使事情变得更加复杂(我认为)。
我通常将实际的触发器定义移动到一个SQL脚本中(我也可以在开发和测试期间分别运行该脚本),然后将该SQL文件包含在Liquibase changelog中:
<changeSet id="42" author="arthur" runOnChange="true">
<sqlFile path="triggers/some_trigger.sql"
stripComments="false"
splitStatements="true"
endDelimiter="/"
relativeToChangelogFile="true"/>
</changeSet>some_trigger.sql脚本存储在git中(svn,...)与XML changelog一起使用。runOnChange="true"是这里的“神奇成分”。您不必接触XML文件,只需编辑SQL脚本即可。在部署期间,Liquibase将检查(SQL)文件是否已更改,并在需要时运行脚本。
发布于 2020-07-28 20:16:12
因此,我相信您已经在本地开发人员数据库中创建/更新/替换了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或team led询问您的团队在编写liquibase脚本时执行的规则。因此,结果可能要复杂得多。
https://stackoverflow.com/questions/63125755
复制相似问题