Bonjour à tous,

Je rencontre un problème de contrainte d'unicité violée avec un index fonction.

Voici le contexte :
J'ai une table case possédant une primary key (nommé objid), une clé étrangère case2condition et un index fonction x_case_cond. J'ai également une table_condition qui est pointée par la clé étrangère case2condition. La table_condition permet de connaître l'état d'un case.


Voici le code de la fonction de l'index (le p_objid en paramètre est l'id de la table_condition) :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
FUNCTION  x_case_cond_fct (p_objid NUMBER)
   RETURN NUMBER DETERMINISTIC
AS
   l_cond      sa.TABLE_CONDITION.condition%TYPE;
   type_cond   NUMBER;
BEGIN
 
   BEGIN
      SELECT condition
        INTO l_cond
        FROM TABLE_CONDITION
       WHERE objid = p_objid;
   EXCEPTION
      WHEN NO_DATA_FOUND
      THEN
         RETURN (NULL);
   END;
 
   IF (l_cond = 2 OR l_cond = 16386 OR l_cond = 16384)
   THEN
      type_cond := 1;
   ELSIF (l_cond = 8 OR l_cond = 10 OR l_cond = 32 OR l_cond = 34)
   THEN
      type_cond := 2;
   ELSE
      type_cond := NULL;
   END IF;
 
   RETURN (type_cond);
END x_case_cond_fct;

La table condition permet de connaître l'état d'un case. Suivant cet état on indexe ou non.

La manipulation que j'effectue est la suivante :

Un patch supprime des enregistrements de la table_case. Un autre patch permet le retour arrière et donc de restaurer les enregistrements supprimés (sauvegardé dans une table tempo).

Or, j'obtiens une erreur ORA-00001 unique constraint (SA.X_CASE_COND) violated lors de la restauration. J'en déduis donc que l'index fonction n'est pas mis à jour lors de l'enregistrement de la table_case.

La seule solution que j'ai trouvé et de reconstruire l'index (alter index x_case_cond rebuild. Mais j'ai peur que cette manip soit trop longue (table_case contient 20 millions de lignes).

Merci d'avance pour votre aide.

Aurélien