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
Partager