使用触发器确保数据一致性

时间:2010-06-30 15:21:28

标签: java oracle triggers consistency

我有一个存储在表格中的层次结构。每个元素都有一个指向前一个,下一个和父

的指针
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。

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

2 个答案:

答案 0 :(得分:2)

有可能通过物化视图(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;

答案 1 :(得分:1)

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