2010-08-05 6 views
1

Je travaille avec plusieurs bases de données dans une application PHP/MySQL. J'ai des bases de données de développement, de test, de mise en scène et de production à synchroniser.Gestion des modifications de schéma mysql avec des scripts et des transactions SQL

Actuellement, nous sommes encore en train de construire la chose, donc il est facile de les synchroniser. J'utilise mon dev db en tant que maître et quand je veux mettre à jour les autres, je les utilise pour les recréer. Cependant, à l'avenir, une fois qu'il y aura de vraies données, je ne peux pas le faire. Je voudrais écrire des scripts SQL sous forme de fichiers texte que je peux modifier avec les modifications PHP qui les accompagnent dans svn, puis appliquer les scripts à chaque instance db quand je les mets à jour.

Je voudrais utiliser des transactions de sorte que s'il y a des erreurs pendant le script, il annulera toutes les modifications partielles effectuées. Toutes les tables sont InnoDB

Lorsque je tente d'ajouter une colonne qui existe déjà, et ajoute une nouvelle colonne comme ceci:

SET FOREIGN_KEY_CHECKS = 0; 
START TRANSACTION; 
ALTER TABLE `projects` ADD COLUMN `foo1` varchar(255) NOT NULL after `address2`; 
ALTER TABLE `projects` ADD COLUMN `foo2` varchar(255) NOT NULL after `address2`; 
COMMIT; 
SET FOREIGN_KEY_CHECKS = 1; 

... il engage toujours la nouvelle colonne, même si elle n'a pas pu ajouter la le premier, bien sûr, parce que j'ai publié COMMIT au lieu de ROLLBACK.

J'en ai besoin pour émettre la commande rollback conditionnellement à une erreur. Comment puis-je faire cela dans un script SQL adhoc?

Je connais la fonction 'declare exit handler' des process stockés mais je ne veux pas la stocker; Je veux juste l'exécuter comme un script ad hoc. Ai-je besoin de faire un proc stocké de toute façon pour obtenir des rollbacks conditionnels, ou existe-t-il un autre moyen de rendre atomique toute la transaction dans un seul script SQL ad hoc?

Tous les liens vers des exemples bienvenus - j'ai googlé, mais je suis seulement de trouver des exemples enregistrés proc jusqu'à présent

Un grand merci

Ian

EDIT - Cela ne va jamais travailler; ALTER TABLE provoque une validation implicite quand il est rencontré: http://dev.mysql.com/doc/refman/5.0/en/implicit-commit.html Merci à Brian pour le rappel

Répondre

2

J'ai appris l'autre jour que les instructions de langage de définition de données sont toujours utilisées dans MySQL et que les transactions sont validées lorsqu'elles sont appliquées. Je pense que vous devrez probablement le faire de manière interactive si vous voulez être sûrs du succès.

Je ne trouve pas la question sur ce site où cela a été discuté (il y a seulement quelques jours).

Si vous devez synchroniser plusieurs bases de données, vous pouvez vous reporter à la réplication. Bien que la réplication ne soit pas négligeable, c'est peut-être ce dont vous avez besoin. Voir http://dev.mysql.com/doc/refman/5.0/en/replication-features.html

+0

salut Brian, merci pour le conseil sur DDL - qui sonne vaguement une sorte de cloche ... Je vais vérifier et mettre à jour la question si je trouve quelque chose. La réplication n'est absolument pas la réponse ici! ... ces copies sont destinées à avoir des données et des schémas différents à différents moments, dans le cadre du processus de développement. – Polsonby

Questions connexes