Oracle
 sql >> Base de données >  >> RDS >> Oracle

Détecter, supprimer les colonnes vides et mettre à jour la base de données dans sql, oracle

Vous interrogez une vue de dictionnaire de données. Il affiche les méta-données , des informations sur la base de données. Cette vue, ALL_TAB_COLUMNS, affiche des informations pour chaque colonne de chaque table (sur lesquelles vous avez des privilèges). Nécessairement, COLUMN_NAME ne peut pas être nul, donc votre requête ne renvoie aucune ligne.

Maintenant, ce que vous voulez faire, c'est interroger chaque table et trouver quelles colonnes ne contiennent aucune donnée. Cela nécessite SQL dynamique. Vous devrez interroger ALL_TAB_COLUMNS, donc vous n'étiez pas complètement hors de propos.

En raison du SQL dynamique, il s'agit d'une solution de programmation, les résultats sont donc affichés avec DBMS_OUTPUT.

set serveroutput on size unlimited 

Voici un bloc anonyme :son exécution peut prendre un certain temps. La jointure à USER_TABLES est nécessaire car les colonnes des vues sont incluses dans TAB_COLUMNS et nous ne voulons pas celles-ci dans le jeu de résultats.

declare
    dsp varchar2(32767);
    stmt varchar2(32767);
begin
    << tab_loop >>
    for trec in ( select t.table_name
                 from user_tables t )
    loop
        stmt := 'select ';
        dbms_output.put_line('table name = '|| trec.table_name);
        << col_loop >>
        for crec in ( select c.column_name
                             , row_number() over (order by c.column_id) as rn
                      from user_tab_columns c
                      where c.table_name = trec.table_name  
                      and c.nullable = 'Y'
                      order by c.column_id )
        loop
            if rn > 1 then stmt := concat(stmt, '||'); end if;
            stmt := stmt||''''||crec.column_name||'=''||'
                        ||'to_char(count('||crec.column_name||')) ';
        end loop col_loop;
        stmt := stmt || ' from '||trec.table_name;
        execute immediate stmt into dsp;
        dbms_output.put_line(dsp);
    end loop tab_loop;
end;

exemple de sortie :

table name = MY_PROFILER_RUN_EVENTS
TOT_EXECS=0TOT_TIME=0MIN_TIME=0MAX_TIME=0
table name = LOG_TABLE
PKG_NAME=0MODULE_NAME=0CLIENT_ID=0

PL/SQL procedure successfully completed.

SQL> 

Toute colonne où COUNT=0 ne contient aucune valeur.

Maintenant, que vous souhaitiez réellement supprimer ces colonnes, c'est une autre affaire. Vous pourriez casser des programmes qui en dépendent. Il vous faut donc d'abord une analyse d'impact. C'est pourquoi je n'ai pas produit de programme qui supprime automatiquement les colonnes vides. Je pense que ce serait une pratique dangereuse.

Il est crucial que les modifications apportées à la structure de notre base de données soient prises en compte et auditées. Donc, si jamais je devais entreprendre un exercice comme celui-ci, je modifierais la sortie du programme ci-dessus afin qu'il produise un script d'instructions de colonne de suppression que je pourrais réviser, modifier et conserver sous contrôle de source.