使用触发器,以确保数据的一致性(using triggers for ensuring data c

2019-09-29 16:35发布

我有存储在表中的分层结构。 每一个元素都有一个指向其先前,未来和家长

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。

但是,我怎么能叫它承诺? 我不想把它在每行更新,只是之前提交完成的可能性,以回滚,如果我的表无效。

Answer 1:

它可能会通过物化视图(MV),正如我所描述的MV约束的组合来执行这项在我的博客在这里 。

这个想法是创建一个仅持有例外规则的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;


Answer 2:

理想情况下,你应该写一个包,是维持本表的控制100%。 如果必要的话,把它放在它自己的模式,锁定权限就可以了,并且只使用这个包来修改表。



文章来源: using triggers for ensuring data consistency