防止更新不存在的行

时间:2012-04-16 22:42:38

标签: sql oracle oracle11g

在工作中,我们有一个表来保存基本上包含以下列的设置:

  • PARAMNAME
  • VALUE

大部分时间都会添加新设置,但在极少数情况下会删除设置。不幸的是,这意味着任何先前可能已更新此值的脚本将继续这样做,尽管更新会导致“0 rows updated”并导致意外行为。

这种情况最近被回归测试失败所取代,但只是在对系统中的数据不同的原因进行了大量调查后才发现。

所以我的问题是:当更新导致零行更新时,有没有办法生成错误条件?

以下是我想到的一些选项,但其中没有一个是真正令人满意的:

  • PL / SQL包装器,它注意到失败的更新并引发异常。
    • 不理想,因为它不会阻止任何人/脚本手动进行更新。
  • 引发异常的表上的触发器。
    • 违反我们目前逐步取消触发器的政策。
    • 每次删除设置时都需要更新触发器并维护过时设置列表(如果要排除)。
    • 可能有变异表的问题(如果通过查询当前存在的设置进行包含)。

3 个答案:

答案 0 :(得分:3)

PL / SQL包装器对我来说似乎是最好的选择。除了生成序列和插入历史记录之外,触发器是逐步淘汰的好东西。

如果您担心有人手动更新而不是使用PL / SQL包装器,只需限制用户角色,使其对表没有UPDATE权限,但对该过程具有EXECUTE权限。

答案 1 :(得分:1)

不是一个真正的解决方案,而是一种组织事情的方法:

使用参数定义创建一个单独的表,并从参数值表链接到该表。引用所需的参数定义(不允许空值)。

定义表PARAMS (ID, NAME)

实际设置表PARAM_VALUES (PARAM_ID, VALUE)

(更改表结构也是一种非常有效的方法来唤起尚未更新的脚本中的错误......)

答案 2 :(得分:1)

可能是您可以使用MERGE语句 这是一个链接

http://www.oracle-developer.net/display.php?id=203

merge语句允许您在同一查询中组合插入和更新,因此如果不存在所需的行,您可以在缓冲区表中插入记录以指示该行不存在,否则您可以更新要求记录

希望有所帮助