Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/03/2011, 19h02   #1
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
Par défaut mon premier trigger

bonsoir, j'aimerais vérifier la syntaxe de mon premier trigger sous postgresql.
mon trigger n'a rien de compliqué, hey oui je commence simple

Code :
1
2
3
4
5
6
7
CREATE TRIGGER delete_dialog AFTER UPDATE ON dialog
AS
BEGIN
    IF ((NEW.beginning = FALSE) AND (NEW.is_creator_absent = TRUE) AND (NEW.is_participant_absent = TRUE)) THEN
        DELETE FROM dialog WHERE dialog_id = NEW.dialog_id;
    END IF;
END;
j'ai trouvé peu de doc sur les triggers en postgresql, alors voilà

merci.
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 19h35   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 440
Points : 6 440
Bonjour,

Sous PostgreSQL, les triggers se définissent en 2 étapes :
  • création d'une fonction trigger (qui contient le code à exécuter au déclenchement du trigger) ;
  • création du trigger proprement dit (qui appel la fonction précédente et précise la cause du déclenchement).

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 20h19   #3
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
voilà, je pense avoir compris le principe.
voici mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE FUNCTION delete_dialog() RETURNS TRIGGER
AS
BEGIN
	DELETE FROM dialog WHERE dialog_id = NEW.dialog_id;
END;
 
CREATE TRIGGER check_end_of_dialog AFTER UPDATE OF is_creator_absent, is_participant_absent ON dialog
AS
BEGIN
	IF ((NEW.beginning = FALSE) AND (NEW.is_creator_absent = TRUE) AND (NEW.is_participant_absent = TRUE)) THEN
		EXECUTE PROCEDURE delete_dialog();
	END IF;
END;
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/03/2011, 23h32   #4
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
j'ai un peu amélioré mon code.
la création de la fonction ne génère aucune erreur, mais le trigger n'est pas accepté. la cause est l'énumération des champs dans le "update of ...".

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE OR REPLACE FUNCTION delete_dialog()
RETURNS TRIGGER
AS $$
BEGIN
        IF ((NEW.beginning = FALSE) AND (NEW.is_creator_absent = TRUE) AND (NEW.is_participant_absent = TRUE)) THEN
	        DELETE FROM dialog WHERE dialog_id = NEW.dialog_id;
        END IF;
END;
$$ LANGUAGE plpgsql;
 
CREATE TRIGGER check_end_of_dialog
AFTER UPDATE OF is_creator_absent, is_participant_absent
ON dialog
EXECUTE PROCEDURE delete_dialog();
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 18h08   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
S'il s'agit d'une version antérieure à la 9.0, c'est la raison du problème car AFTER UPDATE OF n'était pas supporté avant.
Sinon le message d'erreur devrait en dire plus.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 09h58   #6
Membre habitué
 
Inscription : décembre 2007
Messages : 579
Détails du profil
Informations personnelles :
Localisation : France, Seine Maritime (Haute Normandie)

Informations forums :
Inscription : décembre 2007
Messages : 579
Points : 114
Points : 114
voici mon erreur :

Citation:
Erreur SQL :

ERREUR: erreur de syntaxe sur ou près de « OF »
LINE 12: AFTER UPDATE OF is_creator_absent, is_participant_absent
^

Dans l'instruction :

CREATE OR REPLACE FUNCTION delete_dialog()
RETURNS TRIGGER
AS $$
BEGIN
IF ((NEW.beginning = FALSE) AND (NEW.is_creator_absent = TRUE) AND (NEW.is_participant_absent = TRUE)) THEN
DELETE FROM dialog WHERE dialog_id = NEW.dialog_id;
END IF;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER check_end_of_dialog
AFTER UPDATE OF is_creator_absent, is_participant_absent
ON dialog
EXECUTE PROCEDURE delete_dialog();
en effet j'ai la version 8.4 de postgresql, je pensais pourtant avoir installé la version la plus réçente Oo.
thor76160 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h52.


 
 
 
 
Partenaires

Hébergement Web