Requête d'insertion multi base

Requête d'insertion multi base - SQL/NoSQL - Programmation

Marsh Posté le 28-05-2013 à 15:06:30    

Bonjour,
 
J'ai une question (pour m'éviter à faire des while en php et parce que je suis curieux)
 
Je voudrai savoir s'il est possible d'avoir deux liens "identifier" pour une meme requête (donc en passant par php et mysql)
 
Exemple:
 
Insert into `archive`.`test` (`col1`,`col2`) select `col1`,`col2` from `prod`.`test` where `archive`.`test`.`col3`='toto'
 
ça c'est la requête, mais je vois pas comment faire pour la ligne suivante
 
mysql_query("sql",..........) la je vois pas comment mettre mes deux liens (supposant deux bases sur deux serveurs différents)
 
Merci de vos réponse.

Reply

Marsh Posté le 28-05-2013 à 15:06:30   

Reply

Marsh Posté le 28-05-2013 à 15:41:35    

Ben tu crées une connexion par serveur. Sinon, tu exécutes la requête sur le premier serveur, puis tu clos la connexion et t'en rouvres une autre sur le 2ème serveur. Je vois pas trop le pb :??:


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-05-2013 à 16:31:38    

ça je peux le faire si je fais un truc du genre
 

Code :
  1. $link1 = connectionDB1();
  2. $link2 = connectionDB2();
  3. $sql = "select id from test";
  4. $result = mysql_query($sql,$link1);
  5. while($row = mysql_fetch_array($result)){
  6.    $sql = "insert into test (col1) values ('".$row['id]."')";
  7.    $bool = mysql_query($sql,$link2);
  8.    if(!$bool)
  9.       exit;
  10. }


 
La je fais une multitude de requête et il suffit d'un problème qqconque en php pour m'arrêter dans ma boucle (ici si id est un string => il t'attends. ba comment j'ai construit ma requête (sans mysql_real_escape_string) ba ça foire, je m'arrête au milieu de ma boucle et c'est la merde)
 
Je voudrai faire une seule requête d'où la demande (soucis de fiabilité du code + performance)


Message édité par sltpaulo le 28-05-2013 à 16:34:27
Reply

Marsh Posté le 28-05-2013 à 17:42:49    

Tu pourras pas, à commencer par le fait que le sgbd va refuser d'exécuter plusieurs requêtes en une fois quand elles sont passées via PHP. En gros, si t'as 2 requêtes SQL séparées par un ; dans une chaîne que tu passes à mysql_query(), ben seule la première sera exécutée (question de sécurité et éviter des SQL injection entre autre, il me semble).
 
Edit : si ta BD est en InnoDB, tu peux utiliser le mode transactionnel pour qu'au moins, en cas d'erreur en cours de script, tu retrouves ta BD dans l'état initial ;)


Message édité par rufo le 28-05-2013 à 17:43:58

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 28-05-2013 à 18:31:52    

Je sais tout ça, hmmm je sais que mysql ne permet pas de faire ça (la base est en myISAM (non négociable)).
 
Pour préciser un peu mon cas =>
 
meme serveur apache, base1, base 2
 
deux utilisateur mysql, user1, user2
tous les privilège base1 => user1, base2 => user2
 
avec un utilisateur, je peux faire
 
select * from 'base1'.test t1 join 'base2'.test t2 on t1.id=t2.id
 
mais je voudrais faire la meme requete alors que je n'ai acces que aux utilisateurs 1 et 2
 
existe-t-il une solution? (sans modifier cette configuration)

Reply

Marsh Posté le 28-05-2013 à 19:30:50    

C'est quoi ton besoin initial (besoin fonctionnel) ? Parce que la solution que t'essayes de mettre en oeuvre n'est peut-être pas la bonne (solution technique à base de php)...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-05-2013 à 09:45:15    

Je passe par une interface web pour lancer une requête sql, je voudrais que mon serveur travaille uniquement sur le sql, je ne veux pas d'un traitement en php en parallèle.

Reply

Marsh Posté le 29-05-2013 à 09:47:59    

Là, tu exprimes une nouvelle fois une solution technique. mais quel est le besoin fonctionnel, le but à atteindre ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-05-2013 à 10:11:19    

c'est possible : http://stackoverflow.com/questions [...] lect-query
 
pas trivial , mais possible  
( le besoin fonctionnel est visiblememnt d'archiver dans uen base sur un autre serveur ce qui se passe ici )


---------------

Reply

Marsh Posté le 29-05-2013 à 12:04:12    

Je pensais aussi qu'il s'agissait d'une opération d'archivage, mais plutôt que des suppositions, je préférais qu'il le confirme lui-même.  
 
En tout cas, j'aurais appris l'utilité du moteur FEDERATED, merci flo850 :jap:
 
Cela dit, j'ai l'impression qu'il n'est pas à l'abri d'une interruption du traitement de ses requêtes avec cette méthode...


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
Reply

Marsh Posté le 29-05-2013 à 12:04:12   

Reply

Marsh Posté le 30-05-2013 à 11:09:26    

Bonjour, désolé de la réponse tardive, effectivement c'est pour un besoin d'archivage.
 
flo, merci pour ce lien, mais je l'avais déjà visionné :)
 
J'ai adopté une autre solution, j'ouvre plusieurs connexion sql et je fais un traitement en php avant de trouver une meilleur solution (une simple serai de créer un utilisateur avec accès sur les deux bases mais par besoin de sécurité, je ne veux pas).
 
Merci pour votre aide,  
 
Cordialement
 
Paul

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed