【问题标题】:How Can I Maintain a Unique Identifier Amongst Multiple Database Tables?如何在多个数据库表中维护唯一标识符?
【发布时间】:2014-02-01 03:05:54
【问题描述】:

我的任务是为 Oracle 11g 数据库创建历史表。我在这篇文章What is the best way to keep changes history to database fields?的第一个答案中提出了非常类似于基于记录的解决方案@

然后我的老板建议,由于某些表是聚集的,即表 1 中的一些数据与表 2 相关(认为这是表在规范化之前的格式),他希望在那里是在此集群级别的所有表之间维护的版本号。生成版本号的建议方法是使用 SYS_GUID http://docs.oracle.com/cd/B12037_01/server.101/b10759/functions153.htm

我考虑过使用触发器来执行此操作,因此当其中一个表更新时,其他表的版本号随后会更新,但我可以看到一些问题,例如:

  • 如何停止一个表的触发器,然后触发另一个表的触发器?(我们最终会在这里永远调用触发器)
  • 如何停止竞争条件? (即表1和表2同时更新时,如何知道哪个是最新的版本号?)

我是 Oracle 数据库开发的新手,所以关于这是否是一个好主意/是否有更好的方法来做这件事的一些建议会很棒。

【问题讨论】:

    标签: sql database oracle oracle11g


    【解决方案1】:

    我认为您正在寻找的是序列:http://docs.oracle.com/cd/B28359_01/server.111/b28286/statements_6015.htm#SQLRF01314

    表格可以独立地从定义的序列中获取数字,因此不会发生竞争条件或触发器

    【讨论】:

    • 序列在这种情况下不适用,因为当我想更新其他表以匹配新更新的表的版本号时,仍然可能存在竞争条件。在所有相关表之间同步这个数字的问题仍然存在,不过感谢您尝试回答我的问题。
    【解决方案2】:

    第一个问题的简短回答是“不,你不能。”。原因是用户无法停止声明的触发器。我能想象的唯一方法是一些锁定表的存储,例如,您创建一个中间表,并在聚簇表中选择同一行更新。但这确实是一个不好的方法,正如您在第二个问题中已经提到的那样。这将导致可怕的并发问题。

    关于你的第二个问题,你说的很对。不同原始表的不同触发器更新同一个审计表会引起严重的争用。记住触发器工作的方式是明智的,即它们在其余事务提交时提交。因此,如果所有相关的表都将更新同一个审计表,特别是对于同一行,同时会导致理性范式未被使用。标准化的一个好处是性能提升,因为当您更新不同的表时不会互相满足。但在这种情况下,如果您想在审计表中同步不同表的操作。它最终会像一个平面文件一样工作。所以我的建议是尽力说服你的老板使用你原来的提议。

    但是如果您的应用程序总是在一个事务中更新这些聚簇表并将一个审计信息写入审计表。您可以编写一个存储过程来首先更新实体并在事务结束时编写审计。然后你可以使用序列来生成审计表的id。不会有任何争议。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-26
      • 2012-04-24
      • 2013-08-21
      • 1970-01-01
      • 2021-12-16
      • 1970-01-01
      相关资源
      最近更新 更多