Vérifier que les identifiants automatiques sont à jour

2008-06-05 #boulot

L'objectif est de s'assurer que pour toutes les tables qui ont un identifiant automatique, cet identifiant ne soit pas supérieur à la valeur de la séquence utilisée pour générer cet identifiant. (Pourquoi on se retrouve dans cette situation, c'est un autre problème).

Conventions :

  • tous les noms de tables sont préfixés par LUX_
  • tous les noms de clés primaires sont préfixés par PK_
  • tous les noms de séquences sont préfixés par SEQ_LUX_

Générer un script renvoyant la valeur maximum des identifiants de chaque

table

Requête pour générer les SELECT MAX() de chaque table

SELECT 'UNION SELECT ''' || TABLE_NAME || ''' AS TB_NAME, '
       || 'MAX(' || COLUMN_NAME || ') AS TB_IDMAX '
       || 'FROM ' || TABLE_NAME
FROM   USER_IND_COLUMNS
WHERE  TABLE_NAME LIKE 'LUX_%'
AND    INDEX_NAME LIKE 'PK_%'
AND    COLUMN_NAME IN (SELECT COLUMN_NAME FROM COLS WHERE DATA_TYPE = 'NUMBER')
ORDER BY TABLE_NAME

Compléter le script généré

Sous TOAD, faire clic droit dans le résultat de la requête et choisir SaveAs et enregistrer dans le presse-papiers, ce qui donne :

UNION SELECT 'LUX_BANQUES' AS TB_NAME, MAX(IDBANQUE) AS TB_IDMAX FROM LUX_BANQUES
UNION SELECT 'LUX_CLIENTS' AS TB_NAME, MAX(IDCLIENT) AS TB_IDMAX FROM LUX_CLIENTS
UNION SELECT 'LUX_COMPTES' AS TB_NAME, MAX(IDCOMPTE) AS TB_IDMAX FROM LUX_COMPTES
UNION SELECT 'LUX_CONTACTS' AS TB_NAME, MAX(IDCONTACT) AS TB_IDMAX FROM LUX_CONTACTS
...

Dans Notepad, enlever le premier UNION et préfixer par un CREATE TABLE

CREATE TABLE TMP_IDMAXIMUMS AS
SELECT 'LUX_BANQUES' AS TB_NAME, MAX(IDBANQUE) AS TB_IDMAX FROM LUX_BANQUES
UNION SELECT 'LUX_CLIENTS' AS TB_NAME, MAX(IDCLIENT) AS TB_IDMAX FROM LUX_CLIENTS
UNION SELECT 'LUX_COMPTES' AS TB_NAME, MAX(IDCOMPTE) AS TB_IDMAX FROM LUX_COMPTES
UNION SELECT 'LUX_CONTACTS' AS TB_NAME, MAX(IDCONTACT) AS TB_IDMAX FROM LUX_CONTACTS
...

Puis exécuter ce script pour obtenir une première table TMP_IDMAXIMUMS qui enregistrera la valeur maximum de l'identifiant de chaque table

Créer une seconde table pour enregistrer la valeur maximum de chaque

séquence

CREATE TABLE TMP_SEQMAXIMUMS AS
SELECT SUBSTR(SEQUENCE_NAME, 5) AS TB_NAME, LAST_NUMBER AS TB_SEQMAX
FROM   USER_SEQUENCES
WHERE  SEQUENCE_NAME LIKE 'SEQ_LUX_%'

Comparer le contenu des deux tables

SELECT T1.TB_NAME, TB_IDMAX, TB_SEQMAX
FROM   TMP_IDMAXIMUMS  T1,
       TMP_SEQMAXIMUMS T2
WHERE  T1.TB_NAME = T2.TB_NAME
AND    TB_IDMAX > TB_SEQMAX