【问题标题】:using triggers for ensuring data consistency使用触发器确保数据一致性
【发布时间】:2011-03-10 04:54:21
【问题描述】:

我有一个存储在表中的层次结构。每个元素都有一个指向其上一个、下一个和一个父元素的指针

create table CATALOGUE
(
  NAME VARCHAR2(300) not null,
  NEXT_ID NUMBER(38),
  PARENT_ID NUMBER(38),
  PREVIOUS_ID NUMBER(38),
  XID NUMBER(38)
);

我有一个 java 应用程序,它使用 O/R 映射来访问和修改这个表。有时我的目录已损坏,例如它们是没有相同父级的链接元素。我想知道是否可以使用 Oracle 触发器或其他纯 SQL 技术(没有 Java 代码)来确保数据一致性。

这是做事的“正确方式”吗?

如何实现触发器?我可以实现一个存储过程来验证我的表。类似的东西

select count(*) 
from catalogue c1, catalogue c2 
where c1.next_id = c2.previous_id and c1.parent_id != c2.parent_id

应该返回 0。

但是我如何在提交时调用它?我不想在每次行更新时都调用它,就在提交完成之前,如果我的表无效,则有可能回滚。

【问题讨论】:

  • “它们是没有相同父级的链接元素”触发器如何确定“相同父级”可能意味着什么?
  • @S.Lott:为了更清楚,我添加了一些信息。

标签: java oracle triggers consistency


【解决方案1】:

可以通过结合物化视图 (MV) 和对 MV 的约束来强制执行此操作,正如我在 here in my blog 中所描述的那样。

这个想法是创建一个仅包含规则例外的 MV,然后创建一个在将行输入到 MV 时始终失败的约束。像这样的:

create materialized view check_mv
refresh complete on commit as
select 1 dummy
from catalogue c1, catalogue c2 
where c1.next_id = c2.previous_id and c1.parent_id != c2.parent_id

alter table check_mv
add constraint check_mv_chk
check (1=0) deferrable;

【讨论】:

    【解决方案2】:

    理想情况下,您应该编写一个 100% 控制维护此表的包。如有必要,将其放入自己的架构中,锁定其权限,并使用 ONLY THIS PACKAGE 来修改表。

    【讨论】:

    • 感谢您的回答。正如我之前解释的,我有一个 java 应用程序。更准确地说,是一个有缺陷的 Java 应用程序。我想使用纯 SQL 来避免数据库中的不一致。但我不想将业务逻辑的实现从 java 切换到 SQL。
    • 我会提供同样的建议,只是以 java 形式——有一个 java 类来处理这个表的维护。使用它更难强制执行,但对于如此关键的事情,您需要集中控制。否则,您将永远在寻找错误。我不知道您在应用程序中的活动级别,但其他解决方案将涉及额外的开销。祝你好运,对一个有趣的问题 +1...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 2018-07-27
    相关资源
    最近更新 更多