J'ai vidé mes procédures stockées avec les éléments suivants
C:\>mysqldump -u... -p... -n -d --routines --triggers --all-databases > Z:\stuff.sql
Voici une des procédures avec la DROP PROCEDURE incluse:
--
-- Dumping routines for database 'lovesh'
--
/*!50003 DROP PROCEDURE IF EXISTS `LoadMyData` */;
/*!50003 SET @saved_cs_client = @@character_set_client */ ;
/*!50003 SET @saved_cs_results = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client = cp850 */ ;
/*!50003 SET character_set_results = cp850 */ ;
/*!50003 SET collation_connection = cp850_general_ci */ ;
/*!50003 SET @saved_sql_mode = @@sql_mode */ ;
/*!50003 SET sql_mode = '' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50020 DEFINER=`lwdba`@`127.0.0.1`*/ /*!50003 PROCEDURE `LoadMyData`()
DETERMINISTIC
BEGIN
DECLARE NDX INT;
SET NDX = 0;
WHILE NDX < 100 DO
INSERT INTO mydata (ti_time) VALUES (NOW() - INTERVAL CEILING(14400*RAND()) SECOND);
SET NDX = NDX + 1;
END WHILE;
END */;;
DELIMITER ;
/*!50003 SET sql_mode = @saved_sql_mode */ ;
/*!50003 SET character_set_client = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection = @saved_col_connection */ ;
Lorsque vous avez utilisé --skip-opt, c'est ce qui l'a causé car --opt inclut --create-options et DROP PROCEDURE est considéré comme spécifique à MySQL.
-a, --create-options
Include all MySQL specific create options.
(Defaults to on; use --skip-create-options to disable.)
--skip-opt Disable --opt. Disables --add-drop-table, --add-locks,
--create-options, --quick, --extended-insert,
--lock-tables, --set-charset, and --disable-keys.
--skip-opt annulerait --create-options et supprimerait ainsi DROP PROCEDURE.
Mystère résolu !!!
Réponse à la question bonus
Ce ne sont pas des commentaires; ce sont des directives MySQL. Chaque fois que MySQL exécute une commande, il recherche ces directives dans les commentaires
Le nombre 50003 indique que cette commande s'exécutera si et seulement si la version de MySQL est 5.0.3 ou supérieure.
Voici un autre exemple d'un mysqldump:
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `datas` (
`ID` int(2) DEFAULT NULL,
`CATEGORY` int(2) DEFAULT NULL,
`ORD` int(1) DEFAULT NULL
);
/*!40101 SET character_set_client = @saved_cs_client */;
Le nombre 40101 indique que cette commande s'exécutera si et seulement si la version de MySQL est 4.1.1 ou supérieure.
Ces directives SQL sont là pour votre protection si vous chargez ces mysqldumps dans des versions antérieures. Ces directives permettent l'acceptation complète de certaines commandes. Veuillez ne pas les supprimer.
Cependant, si vous ne travaillez qu'avec MySQL 5.0+ et prévoyez de vider vos procédures stockées séparément, vous pouvez les supprimer en utilisant Perl ou awk. Personnellement, je les laisserais.