Я думаю, вы можете решить эту проблему, используя материализованное представление, которое объединяет все TABLEA, TABLEB и TABLEC + groub по идентификатору основной таблицы. Вы должны создать материализованные журналы просмотра, чтобы сделать это быстрым обновляемым видом материализации. И вы добавили ограничение проверки, которое выдает ошибку, когда в материализованном представлении на идентификаторе главной таблицы больше, чем в строке.
Rob van Wijk объясняет здесь http://rwijk.blogspot.com/2009/07/fast-refreshable-materialized-view.html много о быстрорежиме. Роб ван Вейк часто присутствует здесь и в stackoverflow.
Здесь вы можете прочитать об использовании проверочных ограничений на материализованных представлениях: http://technology.amis.nl/blog/475/introducing-materialized-views-as-mechanism-for-business-rule-implementation-complex-declarative-constraints
Использования быстрого refresizable мв означает, что проверка целостности делаются во время совершения, а не во время вставки или updateting данных.
Я очень устал, я не могу проверить его сам, и я не могу представить настоящего примера.
edit1: Вот пример:
Он работает при создании быстрого обновления мв с проверочным ограничением и уникальной функцией на основе индекса.
Сначала мы создаем таблицы:
SQL> create table mastertable (id number(10) not null primary key);
SQL> create table tablea
(id number(10) not null primary key
, master_id number(10) not null references mastertable (id));
SQL> create table tableb
(id number(10) not null primary key
, master_id number(10) not null references mastertable (id));
SQL> create table tablec
(id number(10) not null primary key
, master_id number(10) not null references mastertable (id));
Затем мы создаем мв журналы: (! Столбец umarker действительно необходимы)
SQL> create materialized view log on tablea with rowid (master_id)
including new values;
SQL> create materialized view log on tableb with rowid (master_id)
including new values;
SQL> create materialized view log on tablec with rowid (master_id)
including new values;
мв:
SQL> create materialized view table_abc
refresh fast with rowid on commit
as
select master_id,count(*) master_count, 'A' umarker
from tablea
group by master_id
union all
select master_id,count(*) master_count, 'B' umarker
from tableb
group by master_id
union all
select master_id,count(*) master_count, 'C' umarker
from tablec
group by master_id
/
Теперь добавим ограничение проверки на это mv, чтобы убедиться, что вы не можете дважды вставлять в одну и ту же таблицу подробностей на master_id:
SQL> alter table table_abc add check (master_count in (0,1));
И мы добавим уникальный индекс на основе функции для этого мв, чтобы убедиться, что вы не можете вставить в таблицу А и таблицу Ь с тем же master_id:
SQL> create unique index table_abc_ufbi1 on table_abc
(case when master_count = 1 then master_id else null end);
Test 1 (счастливый путь):
SQL> вставить в основные значения (1);
1 rij is aangemaakt.
SQL> insert into tablea values (1,1);
1 rij is aangemaakt.
SQL> commit;
Commit voltooid.
Тест 2 (одна вставка в таблице А, и одна вставка в таблице б с таким же master_id)
SQL> вставить в mastertable значений (2);
1 rij is aangemaakt.
SQL> insert into tablea values (2,2);
1 rij is aangemaakt.
SQL> insert into tableb values (3,2);
1 rij is aangemaakt.
SQL> фиксации; совершить * ОШИБКА в строке 1: .ORA-12008: Ошибка в пути, чтобы обновить снимок. ОР-00001: Нарушение ограничения UNIQUE (TESTT.TABLE_ABC_UFBI1).
Тест 3 (вставка таблицы в два раза с той же master_id)
SQL> вставить в мастер-таблицы значений (3);
первая строка была создана.
SQL> вставить в значение TABLEA (4.3);
первая строка была создана.
SQL> вставить в значение TABLEA (5.3);
первая строка была создана.
SQL> фиксации; совершить * ОШИБКА в строке 1: .ORA-12008: Ошибка в пути, чтобы обновить снимок. ORA-02290: проверочное ограничение (TESTT.SYS_C0015406) была нарушена.
Какие сценарии? Какая база данных? Я никогда не слышал об использовании сценариев для этого. –
@John: см. Сценарии языка манипулирования данными (DML) –
@rexem: Я знаю, что такое DML, но не так, как это связано с сохранением целостности данных (что само по себе не является). –