当前位置: 首页 > 面试题库 >

删除不存在的序列并创建现有用户时防止错误

轩辕翰
2023-03-14
问题内容

我有一堆创建/删除序列,用户和其他对象的sql脚本。我正在通过liquibase运行这些脚本,但是它们失败了,因为当我尝试删除不存在的序列或创建现有用户时,oracle会抱怨。

有一种防止错误发生的预言方式吗?

某种东西

创建用户/序列(如果不存在)

删除用户/安全性(如果存在)

据我所知,我有以下选择:

  • 编写一个plsql脚本
  • 使用liquibase上下文。
  • 使用liquibase前提条件,但这将意味着过多的工作。

任何想法/想法将不胜感激。


问题答案:

Liquibase具有failOnError属性,您可以在包含可能失败的调用的changeSet上将其设置为false。

<changeSet failOnError="false">
   <createSequence sequenceName="new_sequence"/>
</changeSet>

这使您可以拥有简单的创建用户,创建序列,删除用户和删除序列changeSet,并且如果该语句因用户/序列存在/不存在而引发错误,它们仍将被标记为已运行,并且更新将继续。

这种方法的缺点是,如果它们由于其他原因(错误的权限,连接失败,无效的SQL等)而出错,也会将它们标记为已运行并继续运行。更准确的方法是使用前提条件,例如:

<changeSet>
   <preconditions onFail="MARK_RAN"><not><sequenceExists/></not></preconditions>
   <createSequence name="new_sequence"/>
</changeSet>

当前没有userExists前提条件,但是您可以创建自定义前提条件或退回到该前提条件。有关文档,请参见http://www.liquibase.org/documentation/preconditions.html。



 类似资料:
  • 我有一个用于用户配置文件图像的模型,当我删除具有默认图像的用户时,默认图像也会被删除。我相信这是必须的,因为我设置了on_delete=models.CASCADE。 我尝试在ImageField中启用_delete=PROTECT,但它无法识别该属性。

  • 问题内容: 我想执行一条语句,但是仅当用户不存在时才执行。 最好的方法是什么? 问题答案: 如果要创建用户,则还需要创建一个授权。如果授权不存在,则该授权会隐式创建一个用户(这就是为什么鼓励您在创建授权时包括密码,以防万一它们不存在的原因)。参见http://dev.mysql.com/doc/refman/5.1/en/grant.html 因此,一种选择是仅创建授予(使用密码),然后隐式创建用

  • 连接MySQL操作 mysql -h 主机地址 -u 用户名 -p 用户密码 注:-u与root可以不用加空格,其它参数也一样。 DEMO 打开电脑CMD,输入 mysql -h 127.0.0.1 -u root -p 回车,然后输入密码。就可以连接到本地的MySQL数据库。 创建MySQL用户 CREATE USER 'username'@'host' IDENTIFIED BY 'passw

  • 问题内容: 我有一个存储过程,该过程将通过复制旧表的结构来创建新表。但是在创建新表之前,我需要检查该表是否存在,如果存在,则需要先删除该表。这是我的存储过程。 但是,如果该表存在,我总是会收到类似以下的错误。哪里错了? 问题答案: 让我感到难过…在这种情况下,“如果存在”似乎无法与exec配合使用。更新了以下脚本:

  • 我尝试使用检查序列是否存在于Postgres(plpgsql)中的代码。 如果序列不存在,则创建序列。运行此代码两次会导致异常: 序列...已经存在了。 如何只在序列不存在的情况下创建序列? 如果序列不存在,就不会写入消息,也不会发生错误,所以我不能在这个问题的另一个答案中使用存储过程,因为如果序列存在,它每次都会将消息写入日志文件。

  • 我有一个JPA属性实体,它有子实体(多个比率和多个保留)。在我的JavaScript应用程序中,我通过REST{属性:{速率:[…],拉取JSON,保留[…]} 。速率和保留非常详细,因此当我发布属性更新(如更改名称)时,我会从JSON post有效负载中删除速率和保留。我希望Hibernate可以忽略掉丢失的钥匙,但遗憾的是,它正在删除save上的所有孩子。如果它们不存在,我如何指定Hibern