我有一个存储在表格中的层次结构。每个元素都有一个指向前一个,下一个和父
的指针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。
但是如何在提交时调用它?我不希望在每次更新时调用它,就在提交完成之前,如果我的表无效,可能会回滚。
答案 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%控制维护此表的包。如有必要,将其置于自己的架构中,锁定对它的权限,并仅使用此包来修改表。