5

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

  • PARAMNAME
  • VALUE

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

这种情况最近因回归测试失败而出现,但只是在对系统中的数据为何不同的原因进行了大量调查之后。

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

以下是我想到的一些选项,但没有一个是真正可取的:

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

3 回答 3

3

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

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

于 2012-04-16T23:09:27.620 回答
1

也许您可以使用 MERGE 语句,这里是它的链接

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

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

希望能帮助到你

于 2012-04-17T03:44:41.883 回答
1

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

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

定义表PARAMS (ID, NAME)

实际设置表 PARAM_VALUES (PARAM_ID, VALUE)

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

于 2012-04-16T22:46:46.957 回答