ORA-04091: tableau [bla] est en mutation, de déclenchement et de fonction ne peuvent pas le voir

J'ai récemment commencé à travailler sur des applications complexes, et j'ai été affecté d'un bug à cause de cette erreur:

ORA-04091: table SCMA.TBL1 is mutating, trigger/function may not see it
ORA-06512: at "SCMA.TRG_T1_TBL1_COL1", line 4
ORA-04088: error during execution of trigger 'SCMA.TRG_T1_TBL1_COL1'

Le déclencheur en question ressemble à

    create or replace TRIGGER TRG_T1_TBL1_COL1
   BEFORE  INSERT OR UPDATE OF t1_appnt_evnt_id ON TBL1
   FOR EACH ROW
   WHEN (NEW.t1_prnt_t1_pk is not  null)
   DECLARE
        v_reassign_count number(20);
   BEGIN
       select count(t1_pk) INTO v_reassign_count from TBL1
              where  t1_appnt_evnt_id=:new.t1_appnt_evnt_id and t1_prnt_t1_pk is not null;
       IF (v_reassign_count > 0) THEN
           RAISE_APPLICATION_ERROR(-20013, 'Multiple reassignments not allowed');
       END IF;
   END;

La table possède une clé primaire "t1_pk", "rendez-vous de l'id d'événement"
t1_appnt_evnt_id et une autre colonne "t1_prnt_t1_pk" qui peut ou
contient pas d'autre ligne t1_pk.

Il semble que le déclencheur est essayer de faire en sorte que personne d'autre avec le
même t1_appnt_evnt_id a visée à la même cette ligne fait référence à un renvoi vers une autre ligne, si celui-ci est en se référant à une autre ligne.

Le commentaire sur le rapport de bug à partir de l'administrateur de la base, dit "de retirer le déclencheur, et effectuer la vérification dans le code", mais malheureusement, ils ont un code de propriété génération couches sur le dessus de Hibernate, donc je ne peux même pas savoir où il est écrit, donc je suis en espérant qu'il y est un moyen de faire déclencher le travail. Qui est là?

  • L'application de règles comme ceci seulement dans le code est une mauvaise idée - plusieurs mises à jour simultanées sont difficiles à gérer. Si vous synchronisez votre code, vous pouvez vous retrouver avec sale de blocages entre celle-ci et la base de données de serrures.
  • Bas de ligne d'Oracle déclenche le sucer. Éviter comme la peste, sauf pour des choses aussi simple que la mise à jour des valeurs de séquence, ou "updated_by" champs de type. Leurs déclencheurs aspiré dans les années '90 et ils sucer maintenant.
InformationsquelleAutor Paul Tomblin | 2008-12-17