我对liquibase很陌生,我需要一些帮助。我有一个现有的触发器没有捕获所有的数据;我对本地oracle数据库做了一些更改。现在我需要在liquibase中添加这些更改,但我不知道该怎么做。我知道你不能在liquibase中直接更新原始的.xml文件来违反合同。根据我的理解,我需要创建一个新的changelog.xml文件,然后在另一个post\u迁移文件中包含路径。我的困惑是,我必须放弃原来的触发器,然后创建一个新的文件还是?谢谢!
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)文件是否已更改,如果需要,则运行脚本。
some_trigger.sql
runOnChange="true"
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脚本时强制执行的规则。因此,结果可能要复杂得多。
2条答案
按热度按时间xmd2e60i1#
我从不在xml文件中创建触发器、过程甚至视图,因为这会使事情变得更复杂(我认为)。
我通常将实际的触发器定义移动到一个sql脚本中(在开发和测试期间也可以单独运行),然后在liquibase变更日志中包含该sql文件:
这个
some_trigger.sql
脚本与xml changelog一起存储在git(svn,…)中。这个runOnChange="true"
是这里的“神奇成分”。您不必接触xml文件,只需编辑sql脚本。在部署期间,liquibase将检查(sql)文件是否已更改,如果需要,则运行脚本。m528fe3b2#
因此,我认为您应该在本地开发人员数据库中创建/更新/替换sql触发器,并且现在您希望将liquibase脚本包含到产品的发行发行发行包中。
liquibase不提供特殊的xml语法来创建触发器,因此您只需添加一个新的变更集,将pl/sql脚本保存在标记中。脚本将与您在本地数据库上运行的脚本相同。
示例代码如下:
这段代码只是在调用liquibase update时编译目标数据库中的触发器。在大多数情况下,这就足够了。但我严格建议您向您的dba或团队负责人咨询您的团队在编写liquibase脚本时强制执行的规则。因此,结果可能要复杂得多。