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é »
***
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
En fait cette requête est incomplète. Voici la bonne requête :
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;
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