использование триггеров для обеспечения согласованности данных - PullRequest
1 голос
/ 30 июня 2010

У меня есть иерархическая структура, хранящаяся в таблице.Каждый элемент имеет указатель на свой предыдущий, следующий и родительский

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 ]

2 голосов
/ 30 июня 2010

Возможно реализовать это путем сочетания материализованного представления (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;
1 голос
/ 30 июня 2010

В идеале вы должны написать пакет, который на 100% контролирует ведение этой таблицы. При необходимости поместите его в собственную схему, заблокируйте для него привилегии и используйте ТОЛЬКО ЭТОТ ПАКЕТ для изменения таблицы.

...