Comment faire un trigger qui prend en compte deux tables ?
Résolu
laure
-
laure -
laure -
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
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:
- Comment faire un trigger qui prend en compte deux tables ?
- Créer un compte google - Guide
- Comment savoir qui regarde mon compte facebook - Guide
- Comment créer un compte gmail - Guide
- Comment faire deux colonnes sur word - Guide
- Créer un compte instagram sur google - Guide
1 réponse
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.
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.
laure
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...