0

Je veux comprendre ce que fait avant mise à jour dans les moyens de déclenchement.Avant la mise à jour déclencheur avec l'intégrité référentielle dans Oracle 11g

J'ai une table appelée DEPT_MSTDEPT_ID est la clé primaire. Il dispose de 2 lignes avec DEPT_ID 1 et 2. clé comme principale

Une autre table EMP a colonnes EMP_ID et EMP_DEPT_ID qui est une clé étrangère faisant référence DEPT_ID de la table DEPT.

Maintenant, si j'ajoute déclencheur avant de mise à jour sur les tables EMPEMP_DEPT_ID colonne qui vérifiera si une nouvelle valeur pour EMP_DEPT_ID est présent dans le tableau maître DEPT si maintenant, alors insérera nouvelle ligne avec une nouvelle DEPT_ID à la table DEPT.

Maintenant, si je mets à jour EMP_DEPT_ID à 3 où EMP_DEPT_ID est 2 dans EMP tableau il donne l'erreur de violation de violation d'intégrité parent non trouvé.

Ainsi,

  1. Est-ce que cela signifie que les contrôles Oracle pour les contraintes d'intégrité d'abord, puis appelle la gâchette « avant la mise à jour »?
  2. Alors, comment pouvons-nous contourner cette vérification et appel avant le déclencheur de mise à jour?
  3. Que signifie exactement "avant la mise à jour" ici?
  4. Comment puis-je atteindre le résultat ci-dessus en utilisant des déclencheurs et non en utilisant un bloc PL SQL explicite?

Merci

Répondre

1

non différées clés étrangères sont évaluées avant les déclencheurs sont appelés, oui.

Si vous déclarez la contrainte de clé étrangère à être reportables (ce qui nécessiterait l'abandon et la recréation si la contrainte existante n'est pas reportable)

ALTER TABLE emp 
    ADD CONSTRAINT fk_emp_dept (emp_dept_id) REFERENCES dept(dept_id) 
    INITIALLY DEFERRED DEFERRABLE; 

Dans votre application, vous pouvez définir la contrainte Pour être différé, exécutez votre instruction INSERT qui déclenche le déclenchement et insère la ligne parente. Votre contrainte de clé étrangère sera validée lorsque la transaction est validée.

Une alternative à la définition de la contrainte à reportables serait de renommer la table emp, disons, emp_base, créer une vue nommée emp puis créer un instead of insert déclencheur sur emp qui implémente la logique de la première insertion dans dept puis insertion dans emp_base.

+0

Merci Justin. – KB5