为什么有人在以后使用NoValidate启用约束在Oracle中验证

时间:2017-08-09 04:14:13

标签: sql database oracle plsql

我正在通过程序员在项目中编写的一段Oracle PL-SQL代码来禁用约束,然后在启用第一个"启用时使用novalidate"然后立即"验证"它。 我无意中理解了下面的理由:

        EXECUTE IMMEDIATE
               'ALTER TABLE '
            || i_table_name
            || ' ENABLE NOVALIDATE CONSTRAINT '
            || i_constraint_name;

        EXECUTE IMMEDIATE
               'ALTER TABLE '
            || i_table_name
            || ' ENABLE VALIDATE CONSTRAINT '
            || i_constraint_name;

上述单一陈述中有什么问题? 例如:" ALTER TABLE EMP ENABLE EMP_PK"

请清除这个疑问。

2 个答案:

答案 0 :(得分:1)

Oracle在the documentation

中推荐此订单
  

有效使用诚信约束:程序

  使用诚信   约束状态按以下顺序可以确保最佳效益:

     
      
  • 禁用状态。
  •   
  • 执行操作(加载,导出,导入)。
  •   
  • 启用无效状态。
  •   
  • 启用状态。

  •   
     

使用约束的一些好处   这个顺序是:

     
      
  • 没有锁定。
  •   
  • 所有约束都可以同时启用状态。
  •   
  • 约束启用是并行完成的。
  •   
  • 允许在桌面上进行并发活动。
  •   

答案 1 :(得分:0)

从实践的角度来看,您可能会遇到由于某些数据问题(例如某种遗留数据迁移问题)而导致遗留/旧数据无法通过验证,而只是新数据无法通过验证的情况。

在这种情况下,您希望启用约束,但将其设置为NOVALIDATE。

这为将来的数据启用了约束,但是并没有验证过去的失败(已在数据库中)。

当然,这应该是一个临时措施,因为最终您想修复数据问题,然后使用VALIDATE启用约束,以避免将来出现类似问题。