Tables d'exceptions
Les tables d'exceptions sont des tables créées par l'utilisateur qui imitent la définition des tables à vérifier à l'aide de l'instruction SET INTEGRITY avec l'option IMMEDIATE CHECKED. Ils sont utilisés pour stocker des copies des lignes qui violent les contraintes dans les tables en cours de vérification.
Les tables d'exceptions utilisées par l'utilitaire de chargement sont identiques à celles décrites ici et peuvent donc être réutilisées lors de la vérification avec l'instruction SET INTEGRITY.
Règles de création d'une table d'exceptions
Les règles de création d'une table d'exceptions sont les suivantes:
- Si la table est protégée par une règle de sécurité, la table d'exceptions doit être protégée par la même règle de sécurité.
- Les
n
premières colonnes de la table d'exceptions sont identiques aux colonnes de la table en cours de vérification. Tous les attributs de colonne, y compris le nom, le type de données et la longueur, doivent être identiques. Pour les colonnes protégées, le libellé de sécurité protégeant la colonne doit être le même dans les deux tables. - Toutes les colonnes de la table d'exceptions doivent être exemptes de contraintes et de déclencheurs. Les contraintes incluent l'intégrité référentielle et les contraintes de vérification, ainsi que les contraintes d'index à entrées uniques qui peuvent entraîner des erreurs lors de l'insertion.
- La colonne
(n+1)
de la table d'exceptions est une colonne TIMESTAMP facultative. Permet d'identifier les appels successifs de vérification par l'instruction SET INTEGRITY sur la même table, si les lignes de la table d'exceptions n'ont pas été supprimées avant l'émission de l'instruction SET INTEGRITY pour vérifier les données. La précision de l'horodatage peut être n'importe quelle valeur comprise entre 0 et 12 et la valeur affectée sera le résultat du registre spécial CURRENT TIMESTAMP - La colonne
(n+2)
doit être de type CLOB (32K) ou supérieur. Cette colonne est facultative mais recommandée et sera utilisée pour donner les noms des contraintes que les données de la ligne ne respectent pas. Si cette colonne n'est pas fournie (comme cela peut être garanti si, par exemple, la table d'origine comportait le nombre maximal de colonnes autorisé), seule la ligne sur laquelle la violation de contrainte a été détectée est copiée. - La table d'exceptions doit être créée avec les colonnes
(n+1)
et(n+2)
. - Il n'y a pas de mise en application d'un nom particulier pour les colonnes supplémentaires précédemment répertoriées. Toutefois, la spécification de type doit être suivie avec précision.
- Aucune colonne supplémentaire n'est autorisée.
- Si la table d'origine comporte des colonnes générées (y compris la propriété IDENTITY), les colonnes correspondantes de la table d'exceptions ne doivent pas spécifier la propriété générée.
- Les utilisateurs qui appellent l'instruction SET INTEGRITY pour vérifier les données doivent conserver le privilège INSERT sur les tables d'exceptions.
- La table d'exceptions ne peut pas être une table partitionnée de données, une table organisée en plage ou une table déconnectée.
- La table d'exceptions ne peut pas être une table de requêtes matérialisée ou une table de transfert.
- La table d'exceptions ne peut pas comporter de tables de requêtes matérialisées immédiates d'actualisation dépendantes ou de tables de transfert immédiates de propagation dépendantes.
Les informations de la colonne message
ont la structure suivante:
| Numéro de zone | Contenu | Taille | Commentaires |
|---|---|---|---|
| 1 | Nombre de violations de contrainte | 5 octets | Cadrage à droite avec 0 |
| 2 | Type de première violation de contrainte | 1 octet |
|
| 3 | Longueur de la contrainte / colonneb /index IDc | 5 octets | Cadrage à droite avec 0 |
| 4 | Nom de la contrainte / Nom de la colonneb/index IDc | longueur de la zone précédente | |
| 5 | Séparateur | 3 octets | < espace> < colon> < espace> |
| 6 | Type de violation de contrainte suivante | 1 octet |
|
| 7 | Longueur de la contrainte / de la colonne / de l'ID d'index | 5 octets | Cadrage à droite avec 0 |
| 8 | Nom de contrainte / Nom de colonne / ID d'index | longueur de la zone précédente | |
| ..... | ..... | ..... | Répéter les zones 5 à 8 pour chaque violation |
|
|||
Traitement des lignes dans une table d'exceptions
Les informations des tables d'exceptions peuvent être traitées de différentes manières. Les données peuvent être corrigées et les lignes réinsérées dans les tables d'origine.
S'il n'y a pas de déclencheurs INSERT sur la table d'origine, transférez les lignes corrigées en émettant une instruction INSERT avec une sous-requête sur la table d'exceptions.
- Concevez les déclencheurs INSERT à exécuter en fonction de la valeur d'une colonne qui a été définie explicitement à cet effet.
- Déchargez les données des tables d'exceptions et ajoutez-les à l'aide de l'utilitaire de chargement. Dans ce cas, si vous souhaitez revérifier les données, notez que la vérification des contraintes n'est pas limitée aux lignes ajoutées.
- Sauvegardez le texte de la définition de déclencheur à partir de la vue de catalogue système appropriée. Supprimez ensuite le déclencheur INSERT et utilisez INSERT pour transférer les lignes corrigées à partir des tables d'exceptions. Enfin, recréez le déclencheur à l'aide de la définition de déclencheur sauvegardée.
Aucune disposition explicite n'est prévue pour empêcher l'exécution de déclencheurs lors de l'insertion de lignes à partir de tables d'exceptions.
Une seule violation par ligne est signalée pour les violations d'index à entrées uniques.
Si des valeurs avec des types de données LONG VARCHAR, LONG VARGRAPHIC ou LOB figurent dans la table, les valeurs ne sont pas insérées dans la table d'exceptions en cas de violations d'index à entrées uniques.
Interrogation des tables d'exceptions
La structure de colonne de message dans une table d'exceptions est une liste concaténée de noms de contrainte, de longueurs et de délimiteurs, comme décrit précédemment. Ces informations peuvent être demandées.
WITH IV (C1, C2, MSGCOL, CONSTNAME, I, J) AS
(SELECT C1, C2, MSGCOL,
CHAR(SUBSTR(MSGCOL, 12,
INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,7,5)),5,0)))),
1,
15+INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,7,5)),5,0))
FROM E1
UNION ALL
SELECT C1, C2, MSGCOL,
CHAR(SUBSTR(MSGCOL, J+6,
INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,J+1,5)),5,0)))),
I+1,
J+9+INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,J+1,5)),5,0))
FROM IV
WHERE I < INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,1,5)),5,0))
) SELECT C1, C2, CONSTNAME FROM IV;WITH IV (C1, C2, MSGCOL, CONSTNAME, I, J) AS
(SELECT C1, C2, MSGCOL,
CHAR(SUBSTR(MSGCOL, 12,
INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,7,5)),5,0)))),
1,
15+INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,7,5)),5,0))
FROM E1
UNION ALL
SELECT C1, C2, MSGCOL,
CHAR(SUBSTR(MSGCOL, J+6,
INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,J+1,5)),5,0)))),
I+1,
J+9+INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,J+1,5)),5,0))
FROM IV
WHERE I < INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,1,5)),5,0))
) SELECT C1, C2, CONSTNAME FROM IV WHERE CONSTNAME = 'constraintname';WITH IV (C1, C2, MSGCOL, CONSTNAME, CONSTTYPE, I, J) AS
(SELECT C1, C2, MSGCOL,
CHAR(SUBSTR(MSGCOL, 12,
INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,7,5)),5,0)))),
CHAR(SUBSTR(MSGCOL, 6, 1)),
1,
15+INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,7,5)),5,0))
FROM E1
UNION ALL
SELECT C1, C2, MSGCOL,
CHAR(SUBSTR(MSGCOL, J+6,
INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,J+1,5)),5,0)))),
CHAR(SUBSTR(MSGCOL, J, 1)),
I+1,
J+9+INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,J+1,5)),5,0))
FROM IV
WHERE I < INTEGER(DECIMAL(VARCHAR(SUBSTR(MSGCOL,1,5)),5,0))
) SELECT C1, C2, CONSTNAME FROM IV WHERE CONSTTYPE = 'K';