20 requêtes pour auditer la qualité de la structure de votre base de données

Voici 20 requêtes permettant d’auditer la qualité de la structure de votre base de données, autrement dit son modèle.
Ces 20 requêtes sont le fruit de mon expérience à faire des audits de bases de données et de serveurs SQL depuis maintenant plus de quinze ans.

La présentation a eu lieu aux journées SQL Server qui ont eu lieu les lundi 30 novembre et mardi 1er décembre 2015 chez Microsoft France à Issy les Moulineaux.
Les journées SQL Server sont organisées par le GUSS (Groupe des Utilisateurs de SQL Server) une association française.

Vous trouverez la présentation ICI sous forme de Power Point « pdfisée ».
Vous trouverez les 20 requêtes ICI sous forme de fichier texte/sql aussi « pdfisé »

***

Frédéric Brouard, alias SQLpro, ARCHITECTE DE DONNÉES
Expert  S.G.B.D  relationnelles   et   langage  S.Q.L
Moste  Valuable  Professionnal  Microsoft  SQL Server
Société SQLspot  :  modélisation, conseil, formation,
optimisation,  audit,  tuning,  administration  SGBDR
Enseignant: CNAM PACA, ISEN Toulon, CESI Aix en Prov.

L’entreprise SQL Spot
Le site web sur le SQL et les SGBDR

MVP Microsoft SQL
Server

2 réflexions au sujet de « 20 requêtes pour auditer la qualité de la structure de votre base de données »

  1. Avatar de SQLproSQLpro Auteur de l’article

    En fait cette requête est incomplète. Voici la bonne requête :

    -- 4 ter) types divergents pour colonnes de même nom
    WITH
    T0 AS
    (
    SELECT T.TABLE_SCHEMA, T.TABLE_NAME, C.COLUMN_NAME, DATA_TYPE +
           CASE  
               WHEN DATA_TYPE LIKE '%char' OR DATA_TYPE LIKE '%binary'
                  THEN '(' + CAST(CHARACTER_MAXIMUM_LENGTH AS VARCHAR(16)) + ')'
               WHEN DATA_TYPE = 'datetime2'
                  THEN '(' + CAST(DATETIME_PRECISION AS VARCHAR(16)) + ')'
               WHEN DATA_TYPE = 'time'
                  THEN '(' + CAST(DATETIME_PRECISION AS VARCHAR(16)) + ')'
               WHEN DATA_TYPE = 'datetimeoffset'
                  THEN '(' + CAST(DATETIME_PRECISION AS VARCHAR(16)) + ')'
               WHEN DATA_TYPE IN ('float', 'real')
                  THEN '(' + CAST(NUMERIC_PRECISION_RADIX AS VARCHAR(16)) + ')'
               WHEN DATA_TYPE IN ('decimal', 'numeric')
                  THEN '(' + CAST(NUMERIC_PRECISION AS VARCHAR(16)) + ', ' +
                             CAST(NUMERIC_SCALE AS VARCHAR(16)) + ')'
               ELSE ''
           END AS DATA_TYPE
    FROM   INFORMATION_SCHEMA.COLUMNS AS C
           INNER JOIN  INFORMATION_SCHEMA.TABLES AS T
                 ON C.TABLE_SCHEMA = T.TABLE_SCHEMA
                 AND C.TABLE_NAME = T.TABLE_NAME
    WHERE  TABLE_TYPE = 'BASE TABLE'
    )
    SELECT *
    FROM   T0 AS T1
           JOIN T0 AS T2
                ON T1.COLUMN_NAME = T2.COLUMN_NAME
                AND T1.DATA_TYPE <> T2.DATA_TYPE
                AND T1.TABLE_SCHEMA + '.' + T1.TABLE_NAME < T2.TABLE_SCHEMA + '.' + T2.TABLE_NAME
    ORDER BY 1, 2, 3;
  2. Avatar de battl14battl14

    Bonjour,
    Tous d’abord merci pour cet article très enrichissant et fort utile, je me suis permis de modifier votre requête « 4 ter) types divergents pour colonnes de même nom » qui me semblait plus a même de répondre à ce titre :

    SELECT T.TABLE_SCHEMA, T.TABLE_NAME, C.COLUMN_NAME,
    CASE
    WHEN DATA_TYPE LIKE ‘%char’ THEN DATA_TYPE+’ (‘ + CAST(CHARACTER_MAXIMUM_LENGTH
    AS VARCHAR(16)) + ‘)’
    else DATA_TYPE
    END AS DATA_TYPE

    FROM INFORMATION_SCHEMA.COLUMNS AS C
    INNER JOIN INFORMATION_SCHEMA.TABLES AS T
    ON C.TABLE_SCHEMA = T.TABLE_SCHEMA
    AND C.TABLE_NAME = T.TABLE_NAME
    WHERE TABLE_TYPE = ‘BASE TABLE’
    AND EXISTS
    (SELECT i.TABLE_NAME, i.COLUMN_NAME, DATA_TYPE
    FROM INFORMATION_SCHEMA.COLUMNS as i
    WHERE
    i.COLUMN_NAME = c.COLUMN_NAME and i.TABLE_NAME != C.TABLE_NAME AND i.DATA_TYPE+’ (‘ + CAST(CHARACTER_MAXIMUM_LENGTH
    AS VARCHAR(16)) + ‘)’ != C.DATA_TYPE+’ (‘ + CAST(CHARACTER_MAXIMUM_LENGTH
    AS VARCHAR(16)) + ‘)’ )
    order by 3;

    Cordialement
    battl14

Laisser un commentaire