【问题标题】:Oracle: constraint, that depends on another tableOracle:约束,依赖于另一个表
【发布时间】:2011-06-12 05:30:25
【问题描述】:

对不起,奇怪的标题,不知道如何更好地命名 Q。所以:

我有 3 张桌子。实体A、实体B、AB。经典的多对多实现。

是否有可能创建强制始终在 A 和 B 之间至少存在一种关系的约束。

示例工作流程:

a) 插入A,插入B,插入关系,提交; SUCCESS
b) 插入A,插入B,提交; FALSE

所以问题是:有没有on commit 触发器?或类似的东西。

【问题讨论】:

    标签: oracle triggers constraints


    【解决方案1】:

    您可以在 AB 上设置延迟约束,这将仅在提交时检查值的有效性。 您可以在 EntityA 和 EntityB 表中设置 AB 表的 PK 以供引用,反之亦然(取决于设置延迟约束)。 假设此插入在同一个事务中,如果没有有效条目进入 AB 表,您也许可以推出更改。

    【讨论】:

    • 好吧,我在 AB 上创建了延迟约束。它不会在b) 的情况下触发。
    【解决方案2】:

    没有 ON COMMIT 触发器之类的东西。但是,您通常可以使用物化视图模拟 ON COMMIT 触发器的行为。在你的情况下,你可以

    • 在三个表上创建物化视图日志
    • 创建连接三个表的可快速刷新的物化视图
    • 在物化视图上创建一个约束,如果有任何行未通过验证,则会引发异常

    当您提交时,会发生物化视图刷新。如果对物化视图的约束失败,则提交失败。

    【讨论】:

    • 嗯,是的,它可以工作。感谢您的回答,但我刚刚创建了接受所有数据并对其进行验证的包程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-11
    • 1970-01-01
    相关资源
    最近更新 更多