2010-01-26 4 views
2

Pour chaque table de ma base de données MySQL, j'ai un fichier mytablename.sql qui contient l'instruction CREATE TABLE pour cette table.Comment puis-je tester qu'une instruction SQL "CREATE TABLE" est équivalente à une table existante?

Je veux ajouter un test pour vérifier que personne n'a ajouté/modifié une colonne dans la base de données en direct sans mettre à jour ce fichier - je veux vérifier que je peux recréer une base de données vide en utilisant ces scripts.

Comment puis-je le faire de manière fiable?

Une option serait d'utiliser SHOW COLUMNS FROM mytable (ou DESCRIBE mytable), qui, sur la ligne de commande serait sortie sous forme de tableau comme celui-ci:

+---------+------------------+------+-----+---------------------+----------------+ 
| Field | Type    | Null | Key | Default    | Extra   | 
+---------+------------------+------+-----+---------------------+----------------+ 
| pk_guid | int(10) unsigned | NO | PRI | NULL    | auto_increment | 
| d_start | datetime   | NO | MUL | 0000-00-00 00:00:00 |    | 
| d_end | datetime   | NO | MUL | 0000-00-00 00:00:00 |    | 
+---------+------------------+------+-----+---------------------+----------------+ 

Et puis créer une table temporaire et de comparer les résultats. Cela ne pose aucun problème, sauf que si des colonnes ont été ajoutées à la base de données active, les résultats risquent de ne pas être dans le même ordre. Malheureusement, il ne semble pas possible d'utiliser ORDER BY avec SHOW COLUMNS.

Une autre option serait d'utiliser SHOW CREATE TABLE, mais cela inclut des informations telles que la valeur du compteur AUTO_INCREMENT, dont je ne me soucie pas.

Y a-t-il une meilleure façon de procéder?

+0

Je pense que SHOW CREATE TABLE est le meilleur que vous pouvez obtenir. Qui se soucie de savoir s'il y a des informations supplémentaires, vous pouvez le couper facilement. –

Répondre

1

Je l'ai fait en utilisant un peu ghetto/conduit bande script shell PHP à travers les serveurs de base de données (dev/production setup) dans le passé. Étant donné que vous avez 2 serveurs, et l'un d'entre eux est «bon»:

  • saisir une liste de colonnes pour chaque table à vérifier. SHOW CREATE TABLE fonctionne, ou juste SELECT * FROM x LIMIT 1 si vous n'êtes pas intéressé par les types de données/par défaut éventuellement modifiés.
  • array_sort() les noms des champs par ordre alphabétique, et la boucle à travers chaque comparant tous les changements potentiels qui vous intéressent.

ne recommande pas ce bien!J'ai utilisé cela parce que les administrateurs système ne pensaient pas à octroyer des permissions db complètes à certains sous-traitants, donc c'était juste un filet de sécurité rapide, rien de prévu ou de permanent comme tests unitaires.


Une plus élégante façon plus propre & de le faire (limité à MySQL5 + si?) Serait d'utiliser la base de données du système information_schema, en particulier la table COLUMNS. Si vous n'avez pas 2 serveurs, une base de données séparée pour conserver/copier les informations de colonne (par exemple, un clone de schéma_d'information avec le dernier schéma "correct") fonctionnerait également. Cela vous permet également de comparer les tables, les index, les triggers, les procédures, les utilisateurs/permissions, etc.

1

vous avez écrit:

Une option serait d'utiliser SHOW COLUMNS ... sur la ligne de commande .... [mais] les colonnes pourrait ne pas être dans le même ordre de ligne.

Vous pouvez forcer cette commande, post hoc. Sur un système UNIX-ish, vous pouvez simplement:

$ mysql -Bse 'SHOW COLUMNS FROM possibly_altered' | sort 

et les comparer à pared De même et triés sur SHOW sortie une table temporaire faite par votre fichier .sql. (Le -Bs supprime une partie de ce mysql (1) mise en forme de fantaisie et en-têtes, pas besoin et un peu gênant pour une comparaison plus programmatique.)

Questions connexes