2010-12-03 8 views
3

Donc, je suis un administrateur de systèmes assez bon et peut gérer les serveurs mysql sans problème. Mon problème est en train de coder sql, et plus spécifiquement de coder sql je me sens sûr d'automatiser dans les scripts nocturnes. C'est là que les super types de débordement de piles arrivent.sql trouver et remplacer

J'ai actuellement la synchronisation de mon site de production wordpress sur mon serveur de dev, donc nous avons presque autant de temps à vivre pour tester avant de passer à la production. Juste après avoir mis à jour mysql pour être une copie de la production, j'ai besoin de trouver et de remplacer environ 2000 chaînes.

Tout ce que je dois faire est de trouver un moyen d'exécuter SQL pour trouver et remplacer http://DrunkOnJudgement.com à http://dev.DrunkOnJudgement.com n'importe où dans n'importe quelle table. Aidez-moi Obi wan Kenobis votre seul espoir.

+0

Combien de colonnes/tables doivent être modifiées et cela se produit-il dans le texte ou en tant que valeur entière d'un champ. – tobyodavies

Répondre

4

que vous voulez faire quelque chose comme ça

update nom_table set nom_colonne = remplacer (nom_colonne, 'http://dev.DrunkOnJudgement.com', 'http://DrunkOnJudgement.com') ; Cela vous permettra de remplacer simplement le texte que vous recherchez dans une colonne spécifique par le texte que vous voulez qu'il soit sans modifier le texte qui l'entoure.

par exemple, vous pouvez simplement réduire à quelque chose comme: remplacer (nom_colonne, « dev.DrunkOnJudgment.com », « DrunkOnJudgment.com »)

Vous pouvez également spécifier une clause where de sorte que vous ne remplacez les éléments contenant ce texte si quelque chose comme ceci:

où column_name comme « % dev.DrunkOnJudgement.com% »

Ok pour faire quelque chose comme ça pour toutes les colonnes de toutes les tables, recherche essentiellement l'ensemble db. Vous pouvez utiliser une déclaration comme ceci:

SELECT Concat('UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, ' = REPLACE(', COLUMN_NAME, ',''dev.DrunkOnJudgment.com'',''DrunkOnJudgment.com'')', ' WHERE ', COLUMN_NAME, ' like ''%dev.DrunkOnJudgment.com%''') FROM INFORMATION_SCHEMA.COLUMNS 

sortie sera une instruction SQL comme celle ci-dessus pour chaque colonne et une table dans la base de données et que vous utilisez un remplacement déclaration si elle ne trouve pas le texte, il ne ne remplacez rien, assurez-vous de ne mettre à jour que les enregistrements qui contiennent effectivement ce texte.

Donc, pour automatiser ce que vous utilisez un curseur, je ne l'ai pas testé le code suivant mais il ressemblerait à quelque chose comme ceci:

DECLARE done BOOLEAN DEFAULT 0; 
    DECLARE sql VARCHAR(2000); 

    DECLARE cmds CURSOR 
    FOR 
    SELECT Concat('UPDATE ', TABLE_NAME, ' SET ', COLUMN_NAME, ' = REPLACE(', COLUMN_NAME, ',''dev.DrunkOnJudgment.com'',''DrunkOnJudgment.com'')', ' WHERE ', COLUMN_NAME, ' like ''%dev.DrunkOnJudgment.com%''') FROM INFORMATION_SCHEMA.COLUMN; 

    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; 
    OPEN cmds; 
    REPEAT 
     FETCH cmds INTO sql; 
     PREPARE stmt FROM sql; 
     EXECUTE stmt; 
     DROP PREPARE stmt; 
    UNTIL done END REPEAT; 
    CLOSE cmds; 
+0

Cette réponse peut ensuite être répétée sur chaque table pour toutes les colonnes de cette table pouvant contenir ce texte. – DGH

+0

Le problème est que nous ne connaissons pas tous les noms de table ou les colonnes. Nous pouvons ajouter un plugin qui a aussi besoin d'être mis à jour sans avoir à mettre à jour notre code de synchronisation. C'est le problème que nous avons en ce moment, c'est un certain plugin qui lie à nos images miniatures, 1000 des em et des codes durs l'url plutôt que d'utiliser $ siteurl. chemin ou quoi que ce soit. Je suppose que je pourrais utiliser un script pour analyser chaque colonne de chaque table si. –

+0

Ahhh ok, eh bien, pour faire quelque chose comme ça vous devriez les tables INFORMATION_SCHEMA pour faire une boucle à travers chaque table et colonne dans un curseur. Laissez-moi voir si je peux fouetter quelque chose rapidement. –

4

Est-ce aussi simple qu'une instruction update avec une clause where?

update myTable 
set myCol = 'http://dev.DrunkOnJudgement.com' 
where myCol = 'http://DrunkOnJudgement.com' 
+0

je doute sincèrement qu'il va stocker _just_ l'url dans la colonne, au minimum ce sera http: //example.com/some-page ... – tobyodavies

+0

@tobyodavies - Je suis d'accord, mais c'est ce que l'OP demandé et il semble avoir trouvé une réponse qui convient à ses fins. Je n'ai pas digéré complètement sa question originale au sujet de n'importe quelle colonne, n'importe quel peu de table non plus ... semble être une leçon dans l'écriture de question et la digestion de question! – Chase

+0

Même si je ne vous ai pas choisi comme meilleure réponse. C'était aussi très utile. –

0

A ce stade du cycle de vie de votre produit, je suppose qu'il est trop tard suggérer d'élaborer une solution qui enlève entièrement ce problème? Par exemple, ne pas utiliser d'URL absolues ou remplacer les URL par une variable évaluée lors de l'exécution?

+0

Ouais c'est juste un plugin wordpress mal codé. Je ne devrais pas dire mal codé car cela fonctionne très bien à part le fait qu'ils utilisent des chemins absolus au lieu de $ siteurl. $ path –

Questions connexes