Jump to content

[Mysql 5] L'héritage et les triggers


Recommended Posts

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

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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 :iloveyou:

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 :)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...