CREATION DE TABLES PAR TRIGGER ou PROCEDURE STOCKEE
Voilà mon problème : j'aimerai lors de l'insertion dans une table historique, créer la table historique_AAAA selon l'année si elle n'existe pas et en insérer une copie dans cette nouvelle table !
Voici mon trigger :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
|
DELIMITER $$
CREATE
TRIGGER `HISTORIQUES` AFTER INSERT ON `historique`
FOR EACH ROW BEGIN
DECLARE MYTABLE varchar(15);
DECLARE ANNEE varchar(4);
DECLARE EOF INT default 0;
DECLARE QUERY_SAISON CURSOR FOR SELECT `hsannee` FROM `histosaisons` WHERE `hsannee` = NEW.`chrannee`;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET EOF = 1;
SET MYTABLE = 'historique_' + NEW.`chrannee`;
/* ON OUVRE LA REQUETE */
OPEN QUERY_SAISON;
WHILE EOF <> 1 DO
FETCH QUERY_SAISON INTO ANNEE;
END WHILE;
CLOSE QUERY_SAISON;
/* Si pas d'année */
IF ANNEE IS NULL OR ANNEE='' THEN
insert into `histosaisons` (`hsannee`) values (NEW.`chrannee`);
/* appel de ma procédure stockée car il semble qu'il est impossible de créer une table dans le trigger */
call HISTORIQUES_NEW(MYTABLE);
END IF;
/* On insére dans la table historique_AAAA : sauf que non, ça ne marche pas !*/
insert into historique_NEW.`chrannee` (`chrnum`, `chrannee`, `chrdat`, `chrmon`)
values (NEW.`chrnum`, NEW.`chrannee`, NEW.`chrdat`, NEW.`chrmon`);
END$$
DELIMITER ; |
Qui appelle ma Procédure stockée pour tenter de créer ma nouvelle table !!!
Code:
1 2 3 4 5 6 7 8 9 10 11 12
|
DELIMITER $$
CREATE
PROCEDURE HISTORIQUES_NEW( MY_TABLE varchar(50) )
BEGIN
Execute statement 'create table historique_' + MY_TABLE + ' (chrlig int(10) NOT NULL auto_increment, chrnum int(10) default NULL, chrannee varchar(4) default NULL,chrdat varchar(10) default NULL, chrmon decimal(19,4) default NULL, PRIMARY KEY (chrlig), KEY chrannee (chrannee), KEY chrdat (chrdat), KEY chrmod (chrmod), KEY chrmon (chrmon)) ENGINE=InnoDB DEFAULT CHARSET=latin1;';
END$$
DELIMITER ; |
Alors est-ce possible de créer de nouvelles tables par les triggers ou les procédures stockées ?
Merci
CREATION DE TABLE PAR TRIGGER/PROCEDURE STOCKEE
Je me réponds à moi même... Il est impossible de créer une table même en appelant une procédure stockée par le biais d'un trigger...
Sinon pour ceux que ça interresserait, voici comment créer une nouvelle table par "Procédure stockée" selon un paramètre nom table :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
DELIMITER $$
DROP PROCEDURE IF EXISTS `CREATE_HISTO`$$
CREATE PROCEDURE `HISTORIQUES_NEW`(mytable VARCHAR(15))
BEGIN
SET @rqt = concat('CREATE TABLE ', mytable, ' ( (chrlig int(10) NOT NULL auto_increment, chrnum int(10) default NULL, chrannee varchar(4) default NULL,chrdat varchar(10) default NULL, chrmon decimal(19,4) default NULL, PRIMARY KEY (chrlig), KEY chrannee (chrannee), KEY chrdat (chrdat), KEY chrmod (chrmod), KEY chrmon (chrmon)) ENGINE=InnoDB DEFAULT CHARSET=latin1');
PREPARE myquery FROM @rqt;
EXECUTE myquery;
DEALLOCATE PREPARE myquery;
END$$
DELIMITER ; |