2011-01-20 2 views
1

Désolé pour le titre étrange, ne savent pas comment nommer le Q mieux. Donc:Oracle: contrainte, cela dépend d'une autre table

J'ai 3 tables. EntityA, EntityB, AB. L'implémentation classique de plusieurs-à-plusieurs.

Est-il possible de créer des contraintes qui impose TOUJOURS d'avoir au moins une relation entre A et B.

exemple de flux:

a) insérer un, Insert B, insérer relation, commit ;
b) Insérer A, Insérer B, valider; Donc, la question est: y a-t-il un déclencheur on commit? Ou quelque chose de similaire à.

Répondre

2

Il n'y a pas de déclencheur ON COMMIT. Cependant, vous pouvez généralement simuler le comportement d'un déclencheur ON COMMIT en utilisant des vues matérialisées. Dans votre cas, vous pouvez

  • créer vue matérialisée journaux sur les trois tables
  • créer une vue matérialisée rapide actualisable qui relie les trois tables
  • créer une contrainte sur la vue matérialisée qui soulève une exception si des lignes échouent à la validation

Lorsque vous validez, l'actualisation de la vue matérialisée a lieu. Si une contrainte sur la vue matérialisée échoue, la validation échoue.

+0

Eh bien, oui, ça pourrait marcher. Merci pour la réponse, mais je viens de créer une procédure de paquet qui accepte toutes les données et les valide. – zerkms

0

Vous pouvez définir des contraintes différées sur AB qui vérifieront la validité des valeurs uniquement lors de la validation de celles-ci. Vous pouvez configurer le PK de la table AB dans les tables EntityA et EntityB pour le référencement ou vice versa (en fonction de la définition des contraintes différées). En supposant que ces insertions sont dans une même transaction, vous pouvez peut-être déployer les modifications, si aucune entrée valide ne passe dans la table AB.

+0

Eh bien, j'ai créé une contrainte différée sur AB. Cela ne se déclenche pas dans le cas où 'b)'. – zerkms

Questions connexes