我正在实施liquibase用于数据库部署,是liquibase的新功能,学习它。 问题:我有pks / pkb包,我想用liquibase部署它们,我故意在pkb包中添加错误(更改pks中不存在的函数名)。 Liquibase总是将这些包部署到成功状态的数据库,但是当我使用Oracle SQL开发人员查看包时出现编译错误。如果包中存在错误,Liquibase应该部署失败。 我的感受:如果pks / pkb有任何编译错误,liquibase不应该部署它们并且应该通过错误
注意:我正在使用包文件路径,“
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<databaseChangeLog
xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.2.xsd
http://www.liquibase.org/xml/ns/dbchangelog-ext
http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd">
<changeSet author="N_Pawar" id="86e6529" failOnError="true" dbms="oracle">
<sqlFilePath="D:/Jenkins_Build/CentralLOB/Builds/dev/DevOps/Database/OraclePackage/Packages/PKG_ENTITYNOTESORDSDevOps.pkb" stripComments="true" endDelimiter="\n/" relativeToChangelogFile="false"/>
</changeSet>
</databaseChangeLog>
寻求帮助,非常感谢任何建议/指导,提前谢谢
答案 0 :(得分:1)
这里的问题是,如果JDBC驱动程序从CREATE(或UPDATE)PACKAGE(BODY)...语句返回错误代码,Liquibase(到目前为止)仅报告错误。但是,Oracle RDBMS不会将包(或包体)编译期间的错误计为语句错误。对于复杂的项目(特别是当存在循环类型依赖项时),即使代码很好,也常常无法完全避免编译错误。这就是在每个过程/包/函数之后立即检查对象状态不一定是个好主意的原因。
在我们的软件项目中,我们使用额外的&#34;更改集&#34; (实际上只进行验证)每次在部署结束时运行(runAlways =&#34; true&#34;)。在那里,我们执行下面的PL / SQL块(DBMS_UTILITY不需要任何特殊的EXECUTE特权IIRC)。如果模式中存在任何无效对象(也可能是不同的对象类型,例如同义词......),则会抛出语句/运行时异常。在我们的开发团队中,我们规定在每次成功的模式迁移之后,不存在无效对象。
注意:如果您使用一个Liquibase会话来更改多个模式中的对象,则需要调整下面的脚本来支持它。该脚本是为单模式部署而制作的。
DECLARE
v_num_errors INTEGER;
BEGIN
/* Executing this twice seems to be necessary with Oracle on occasion, cannot really say why */
DBMS_UTILITY.COMPILE_SCHEMA(schema => USER, compile_all => FALSE);
DBMS_UTILITY.COMPILE_SCHEMA(schema => USER, compile_all => FALSE);
SELECT COUNT(*) INTO v_num_errors FROM user_objects WHERE status<>'VALID';
IF v_num_errors > 0 THEN
RAISE_APPLICATION_ERROR(-20000, 'At least one object in the schema is invalid. Please execute '
|| 'SELECT * FROM user_errors to see the details.');
END IF;
END;
/