Comment faire un trigger qui prend en compte deux tables ?

Résolu/Fermé
laure - 25 avril 2013 à 11:45
 laure - 25 avril 2013 à 14:49
Bonjour,

je voudrais savoir comment faire un trigger qui prend en compte deux tables, car je voudrais modifier une table, quand une ligne de l'autre table est modifiée...

la base de données est celle d'un camping avec les tables :
- location (qui contient les colonnes id_location, debut_loc, fin_loc)
- option_location (avec les colonnes id_location, id_option, debut_option, fin_option)

Les dates de l'option doivent donc être comprises dans celles de la location

Il vaut vérifier qu'on ne peut pas modifier les bornes de l'option sans violer la contrainte, et en plus avoir un comportement automatique qui corrige les bornes de l'option si les dates de la location sont modifiées de sorte que les dates de l'option soient alors à l'extérieur des dates de location.

J'ai fait un premier trigger qui s'occupe uniquement de vérifier qu'on ne peut pas modifier les bornes de l'option sans violer la contrainte (donc trigger sur la table option), dans l'idée de faire un autre trigger à part pour le comportement automatique.

mais je ne comprends pas sur quelle table le situer puisqu'il agit lorsqu'on modifie une ligne de la table location, mais qu'il doit lui-même modifier la table option...
voilà ce que j'ai essayé :

CREATE OR REPLACE FUNCTION verif_chevauchement_option2() RETURNS trigger AS $verif_chevauchement_option2$
DECLARE
nbDeb integer;
nbFin integer;
BEGIN
nbDeb = (SELECT COUNT(id_location) FROM location NATURAL JOIN option_location WHERE NEW.debut_loc>debut_option);
nbFin = (SELECT COUNT(id_location) FROM location NATURAL JOIN option_location WHERE NEW.fin_loc<fin_option);

IF (nbDeb>0) THEN debut_option=NEW.debut_loc;
END IF;
IF (nbFin>0) THEN fin_option=NEW.fin_loc;
END IF;
RETURN NEW;
END
$verif_chevauchement_option2$ LANGUAGE plpgsql;

DROP TRIGGER IF EXISTS verif_chevauchement_option2 ON location;

CREATE TRIGGER verif_chevauchement_option2 BEFORE INSERT OR UPDATE ON location
FOR EACH ROW EXECUTE PROCEDURE verif_chevauchement_option2();


petite précision : le langague n'est pas mySQL mais postgreSQL
comment je m'en doutais, ce trigger me renvoie une erreur au niveau de debut_option, j'ai essayé de préciser en remplaçant par option_location.debut_option mais j'ai le même problème

voilà, si quelqu'un sait comment faire, ce serait super sympa...
merci d'avance,
a bientôt
A voir également:

1 réponse

Célien Messages postés 5729 Date d'inscription jeudi 8 mai 2008 Statut Membre Dernière intervention 9 septembre 2021 1 993
Modifié par Célien le 25/04/2013 à 14:40
Salut,

Sous postgreSQL les procédures stockées sont en PL/pgSQL, par contre sous MySQL les procédures stockées sont en SQL:2003.
Pour en savoir plus voir la doc MySQL, tu peu aussi lire les tutoriels SQL.
0
j'ai cherché justement dans la doc sql et lu divers tutoriels mais je n'ai rien trouvé qui parle de trigger modifiant automatiquement une table lorsqu'une ligne est ajoutée/modifiée dans une autre table...
0