Liquibase没有编译oracle pkb / pks packges,

时间:2017-07-09 11:50:49

标签: oracle11g liquibase

我正在实施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>

寻求帮助,非常感谢任何建议/指导,提前谢谢

1 个答案:

答案 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;
/