Nat*_*and 15
Liquibase有一个failOnError属性,你可以在包含可能失败的调用的changeSets上设置为false.
<changeSet failOnError="false">
<createSequence sequenceName="new_sequence"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
这允许您具有简单的创建用户,创建序列,删除用户和删除序列changeSet,并且如果语句因为用户/序列存在/不存在而引发错误,则它们仍将被标记为已运行并且更新将继续.
这种方法的缺点是,如果由于某些其他原因(错误的权限,连接失败,无效的SQL等)出错,它也会将它们标记为已运行并继续运行.更准确的方法是使用前置条件,如下所示:
<changeSet>
<preconditions onFail="MARK_RAN"><not><sequenceExists/></not></preconditions>
<createSequence name="new_sequence"/>
</changeSet>
Run Code Online (Sandbox Code Playgroud)
当前没有userExists前提条件,但您可以创建自定义前提条件或回退到前提条件.有关文档,请参阅http://www.liquibase.org/documentation/preconditions.html
编写一个与此类似的函数do_ddl并捕获您想要捕获的所有异常:
DECLARE
allready_null EXCEPTION;
PRAGMA EXCEPTION_INIT(allready_null, -1451);
BEGIN
execute immediate 'ALTER TABLE TAB MODIFY(COL NULL)';
EXCEPTION
WHEN allready_null THEN
null; -- handle the error
END;
/
Run Code Online (Sandbox Code Playgroud)