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:

Tableau 1. Structure de colonne de message de la table d'exceptions
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
  • D -Suppression de la violation en cascade
  • F -Violation de clé externe
  • G -Violation de colonne générée
  • I -Violation d'index uniquea
  • K -Vérification de la violation de contrainte
  • L -Violation des règles d'écriture LBAC
  • P -Violation de partitionnement de données
  • S -Libellé de sécurité de ligne non valide
  • X -Index défini sur la violation de colonne XMLd
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
  • D -Suppression de la violation en cascade
  • F -Violation de clé externe
  • G -Violation de colonne générée
  • I -Violation d'index unique
  • K -Vérification de la violation de contrainte
  • L -Violation des règles d'écriture LBAC
  • P -Violation de partitionnement de données
  • S -Libellé de sécurité de ligne non valide
  • X -Index défini sur la violation de colonne XMLd
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
  • a Les violations d'index à entrées uniques ne se produisent pas lors de la vérification à l'aide de l'instruction SET INTEGRITY, sauf après une opération d'association. Cela sera signalé, cependant, lors de l'exécution de LOAD si l'option FOR EXCEPTION est sélectionnée. Toutefois, LOAD ne signale pas les violations de contrainte de vérification, de colonne générée, de clé externe, de cascade de suppression ou de partitionnement de données dans les tables d'exceptions.
  • b Pour extraire l'expression d'une colonne générée des vues de catalogue, utilisez une instruction select. Par exemple, si la zone 4 est MYSCHEMA.MYTABLE.GEN_1, puis SELECT SUBSTR (TEXT, 1, 50) FROM SYSCAT.COLUMNS WHERE TABSCHEMA ='MYSCHEMA'AND TABNAME ='MYNAME'AND COLNAME ='GEN_1'; renvoie les cinquante premiers octets de l'expression, au format AS (< expression>)
  • c Pour extraire un ID d'index des vues de catalogue, utilisez une instruction select. Par exemple, si la zone 4 est 1234, SELECT INDSCHEMA, INDNAME FROM SYSCAT.INDEXES WHERE IID=1234.
  • d Pour l'index défini sur les violations de colonne XML, le nom de contrainte, le nom de colonne ou la zone d'ID d'index identifie la colonne XML qui a subi une violation d'intégrité dans l'un de ses index. Il n'identifie pas l'index qui a subi la violation d'intégrité. Il identifie uniquement le nom de la colonne XML sur laquelle se produit la violation d'index. Par exemple, la valeur X00006XTCOLZ dans la colonne de message indique qu'une violation d'index s'est produite dans l'un des index de la colonne XTCOL2 .

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.

S'il existe des déclencheurs INSERT et que vous souhaitez terminer l'opération de chargement avec les lignes corrigées des tables d'exceptions sans exécuter les déclencheurs:
  • 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.

Par exemple, pour extraire une liste de toutes les violations, en répétant chaque ligne avec uniquement le nom de la contrainte, supposons que la table d'origine T1 comporte deux colonnes, C1 et C2. Supposons également que la table d'exceptions correspondante, E1, comporte les colonnes C1 et C2, correspondant à celles de T1, ainsi qu'une colonne de message, MSGCOL. La requête suivante utilise la récursivité pour répertorier un nom de contrainte par ligne (lignes répétitives ayant plusieurs violations):
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;
Pour répertorier toutes les lignes qui violent une contrainte particulière, la requête précédente peut être étendue comme suit:
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';
La requête suivante peut être utilisée pour obtenir toutes les violations de contrainte de vérification:
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';