Je pense que vous pouvez résoudre cela en utilisant une vue matérialisée qui est une union de TABLEA, TABLEB et TABLEC + group by sur l'identifiant de la table maître. Vous devez créer des logs de vue matérialisée pour rendre cela une vue matérialisée rafraîchissable rapidement. Et vous devez ajouter une contrainte de vérification qui génère une erreur lorsqu'il y a plus d'une ligne dans la vue matérialisée par identifiant de table maître.
Rob van Wijk explique ici http://rwijk.blogspot.com/2009/07/fast-refreshable-materialized-view.html beaucoup de choses sur les mv's rafraîchissables rapidement. Rob van Wijk est souvent présent ici sur stackoverflow aussi.
Ici, vous pouvez lire sur l'utilisation des contraintes de vérification sur les vues matérialisées : http://technology.amis.nl/blog/475/introducing-materialized-views-as-mechanism-for-business-rule-implementation-complex-declarative-constraints
Utiliser des vm's rafraîchissables rapidement signifie que la vérification d'intégrité est effectuée lors de la validation, et non lors de l'insertion ou de la mise à jour des données.
Je suis très fatigué je ne peux pas le tester moi-même et je ne peux pas fournir un exemple réel.
edit1: Voici l'exemple :
Cela fonctionne lorsque vous créez une vue matérielle à rafraîchissement rapide avec une contrainte de vérification et un index unique basé sur une fonction.
Tout d'abord, nous créons les tables :
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));
Ensuite, nous créons les logs de mv :
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;
La mv (la colonne umarker est vraiment nécessaire !) :
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
/
Ensuite, nous ajoutons une contrainte de vérification à cette vue matérialisée pour garantir que vous ne pouvez pas insérer deux fois dans la même table de détails par identifiant maître :
SQL> alter table table_abc add check (master_count in (0,1) );
Et nous ajoutons un index unique basé sur une fonction à cette vue matérialisée pour garantir que vous ne pouvez pas insérer dans la table a et la table b avec le même identifiant maître :
SQL> create unique index table_abc_ufbi1 on table_abc
(case when master_count = 1 then master_id else null end);
Test 1 (le cas simple) :
SQL> insert into mastertable values (1);
1 ligne créée.
SQL> insert into tablea values (1,1);
1 ligne créée.
SQL> commit;
Validation terminée.
Test 2 (une insertion dans table a et une insertion dans table b avec le même identifiant maître)
SQL> insert into mastertable values (2);
1 ligne créée.
SQL> insert into tablea values (2,2);
1 ligne créée.
SQL> insert into tableb values (3,2);
1 ligne créée.
SQL> commit; commit * ERREUR à la ligne 1: .ORA-12008: Erreur dans le chemin de rafraîchissement de la vue. ORA-00001: Violation de contrainte UNIQUE (TESTT.TABLE_ABC_UFBI1).
test 3 (insertion dans la table a deux fois avec le même identifiant maître)
SQL> insert into mastertable values (3);
1 ligne créée.
SQL> insert into tablea values (4,3);
1 ligne créée.
SQL> insert into tablea values (5,3);
1 ligne créée.
SQL> commit; commit * ERREUR à la ligne 1: .ORA-12008: Erreur dans le chemin de rafraîchissement de la vue. ORA-02290: Violation de la contrainte de vérification (TESTT.SYS_C0015406).