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
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