lmarin Posté(e) le 2 juillet 2006 Partager Posté(e) le 2 juillet 2006 Bonjour, J'ai un petit souci avec du mysql.... Ayantappris comment réaliser de l'héritage en SQL par le biais de trigger, il me faut utiliser une fonction SQL qui interronpt l'execution du code. Sous oracle, cette fonction est raise_application_error, hors elle n'éxiste pas sous mysql 5. Aprés m'etre renseigner, il semblerais qu'une fonction analogue existe, cependant, je n'arrive pas a mettre les doit dedans.... Si vous aviez la réponse, ou une solution a mon probléme, je suis preneur. Merci Lien vers le commentaire Partager sur d’autres sites More sharing options...
Sentinel Posté(e) le 2 juillet 2006 Partager Posté(e) le 2 juillet 2006 Apparemment ce n'est pas possible, mais il existe des astuces pour contourner le problème : http://forums.mysql.com/read.php?99,55108,55541 Lien vers le commentaire Partager sur d’autres sites More sharing options...
astero-H Posté(e) le 3 juillet 2006 Partager Posté(e) le 3 juillet 2006 A mon gout le "hack" le plus interessant c'est celui là : Here's a workaround I came up with that's along the lines of the "unique constraint violation" and "non-existent procedure" techniques. However, it allows you to pass an error message that most clients will display. Here is the stored procedure which "raises the error." delimiter // -- -- Raise an error. -- CREATE PROCEDURE raise_error ( p_msg VARCHAR(128)) BEGIN DECLARE _msg TINYINT; -- Force an error to be raised by assigning a string to an -- integer variable. The string will appear on the client. SET _msg = p_msg; END// delimiter; Then, in another file, I have a trigger that calls it: CALL raise_error ('Something bad just happened.'); When the procedure is called, I get the message "#22007Truncated incorrect INTEGER value: 'Something bad just happened.'" These workarounds are kind of nasty, but I guess you have to make do with what you've got. By the way, I have app and SP logic that tries to prevent these errors from happening in the first place. It's really just there to prevent stupid mistakes. Je crois que c'est le seul qui permet de récup quelque chose pour identifier l'erreur. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lmarin Posté(e) le 5 juillet 2006 Auteur Partager Posté(e) le 5 juillet 2006 C'est effectivement ce que je pensais aussi. Je testes voi si ca passe, je vous tien au courant. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lmarin Posté(e) le 5 juillet 2006 Auteur Partager Posté(e) le 5 juillet 2006 Je vien de mettre la main sur une potentielle solution qui n'utilise pas la raise_error et qui est purement d'ordre algorythmique. Voici le code, les explication aprés : Il s'agit d'une BD pour modéliser un JDR CREATE TABLE Lieux ( id_lieu INT(11) NOT NULL PRIMARY KEY, nom VARCHAR(120) NOT NULL , typeLieu ENUM("Systemes","Planetes","Villes","Domicils") NOT NULL )ENGINE = InnoDb; CREATE TABLE Systemes ( id_systeme INT(11) NOT NULL PRIMARY KEY, KEY ( id_systeme ) , FOREIGN KEY ( id_systeme ) REFERENCES Lieux( id_lieu ) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE = InnoDb; CREATE TABLE Planetes ( id_planete INT(11) NOT NULL PRIMARY KEY, KEY ( id_planete ) , FOREIGN KEY ( id_planete ) REFERENCES Lieux( id_lieu ) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE = InnoDb; CREATE TABLE Villes ( id_ville INT(11) NOT NULL PRIMARY KEY, KEY ( id_ville ) , FOREIGN KEY ( id_ville ) REFERENCES Lieux( id_lieu ) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE = InnoDb; CREATE TABLE Domicils ( id_domicil INT(11) NOT NULL PRIMARY KEY, KEY ( id_domicil ) , FOREIGN KEY ( id_domicil )REFERENCES Lieux( id_lieu ) ON DELETE CASCADE ON UPDATE CASCADE )ENGINE = InnoDb; DELIMITER // CREATE TRIGGER CreaLieux AFTER INSERT ON Lieux FOR EACH ROW BEGIN IF NEW.typeLieu="Systemes" THEN INSERT INTO Systemes VALUES(NEW.id_lieu); END IF; IF NEW.typeLieu="Planetes" THEN INSERT INTO Planetes VALUES(NEW.id_lieu); END IF; IF NEW.typeLieu="Villes" THEN INSERT INTO Villes VALUES(NEW.id_lieu); END IF; IF NEW.typeLieu="Domicils" THEN INSERT INTO Domicils VALUES(NEW.id_lieu); END IF; END // DELIMITER; Ainsi, lors de la création d'un lieu, on as juste a faire un : INSERT INTO Lieux(1,'TERRE','Planetes'); et le trigger se chargera du reste :) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.