【问题标题】:How to enable trigger over all tables that has foreign key reference to another table in oracle 11g?如何在 oracle 11g 中对具有对另一个表的外键引用的所有表启用触发器?
【发布时间】:2017-08-26 12:00:51
【问题描述】:

在数据库中,我有一个名为Organization 的基表,大多数表都有外键。假设在 ERD 之下:

如您所见,Organization 表有一个名为 is_enabled 的列。现在如果我想禁用Organization,我应该将is_enabled 设置为1。这很简单,但问题是如果我想阻止所有其他过程和函数使用禁用的Organization,我应该在所有具有对Organization 表的外键引用的表上定义trigger,并且这种方式不好。

是否有另一种方法可以防止所有对象使用禁用的Organizations? 也用于插入或更新数据,例如,如果我有一个带有 org1 标题的Organization,并且如果它有一个带有 dep1 名称的Department,则在我禁用后org1,我无法更新 dep1 名称,并且所有引用 Organization 的表都存在此问题。

【问题讨论】:

  • 在这个表中是的,但可能在其他表上存在两个或更多列
  • 八个 hundred 表与组织的外键引用似乎很多,这就是我想说的。尤其是只有几列的八百张桌子。 ???
  • 我做了一个简单的 ERD 来识别问题,每个表都有自己的列
  • 请澄清“使用”的含义。当涉及残疾组织的记录被 a) 更改 b) 查询时会发生什么?
  • 不应在触发器中实现诸如“您无权更新已禁用的组织”之类的业务逻辑。更好的解决方案是有一个过程,您可以调用该过程来执行所需的操作,并进行所有需要的一致性检查。祝你好运。

标签: database oracle triggers foreign-keys data-consistency


【解决方案1】:

如果您想阻止用户更改禁用组织的数据,这应该在您的代码中 - 在存储过程或应用程序代码中。您可以在用户界面中设置一些逻辑或限制,以防止对禁用的组织进行更改(实际实施取决于您的要求)。

我在 cmets 中遇到的另一个问题(如 Bob Jarvis 所述)是,为什么您有 800 个带有组织 ID 的表?这似乎没有被规范化。

例如,为什么一个人会直接链接到组织表?他们是否可以链接到部门表,该表有自己的组织链接?

【讨论】:

  • 按照你说的方式,我应该在存储过程中更改代码中的许多地方。但我不想这样做,因为大量的变化。对于您的问题,就像您在 cmets 中一样,我创建了一个简单的 ERD 以避免问题的复杂性。实际模型更大,列更多。
  • 有哪些替代方案?如果数据库和系统设计良好,那么在正确的位置进行更改应该很容易。如果很难阻止用户更新禁用组织的数据,那么您应该重构代码以使其更易于更新。现在短期痛苦换长期收益:)
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 2021-01-11
  • 2021-08-17
  • 2013-05-15
  • 1970-01-01
  • 1970-01-01
  • 2011-02-19
  • 1970-01-01
相关资源
最近更新 更多