PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 Re : Général » [PROBLEME] Trigger sur PostgreSQL 8.3 » 19/08/2009 12:18:11

Je viens d'appliquer votre conseil, merci encore pour votre aide précieuse.

#2 Re : Général » [PROBLEME] Trigger sur PostgreSQL 8.3 » 19/08/2009 11:28:08

En effet, je viens de changer mon trigger en BEFORE avec le code procédural suivante :

DECLARE
cur    INTEGER;
lim    INTEGER;
BEGIN

IF (TG_OP = 'UPDATE') THEN
        cur  = NEW.current_files_number;
        lim  = OLD.files_limit;
END IF;

IF (cur >= lim) THEN
        NEW.disabled := TRUE;
        RETURN NEW;
END IF;

RETURN NEW;
END;

cela marche parfaitement.

Merci beaucoup de votre aide.

#3 Re : Général » [PROBLEME] Trigger sur PostgreSQL 8.3 » 19/08/2009 11:15:01

Merci pour votre réponse guillaume,

En effet, ca tombe dans une boucle infinie, je comprends mieux mon erreur.

Par contre, je ne peux pas mettre directement la colone disabled = true. Il m'envoie l'erreur suivante :

CONTEXT:  SQL statement in PL/PgSQL function "change_folder_status" near line 14
2009-08-18 11:12:16 ERROR  : ERREUR:  erreur de syntaxe sur ou près de « disabled »
LINE 1: disabled = TRUE
        ^

C'est un trigger after, donc il est appellé après un update sur la table t_photo_folder.

Pour répondre à votre curiosité, je compare le nombre total de fichiers dans un dossier à le nombre courant de fichier dans le dossier : en effet, il faut que je renomme ma colonne en current_files_number.

#4 Général » [PROBLEME] Trigger sur PostgreSQL 8.3 » 19/08/2009 10:32:41

GoLDoRaK
Réponses : 7

Bonjour à tous,

Je recontre un problème avec les triggers de PostgreSQL. En effet, il m'est impossible de modifier une colonne de type boolean par l'intermédiaire d'un trigger.

Voici mon code procédural PL/pgSQL

1. DECLARE
2. cur    INTEGER;
3. im    INTEGER;
4. pfID   INTEGER;
5. dis    BOOLEAN;
6. BEGIN
7.
8. IF (TG_OP = 'UPDATE') THEN
9.          cur  = NEW.current_size;
10.         lim  = OLD.files_limit;
11.         pfID = NEW.photo_folder_id;
12. END IF;
13. 
14. IF (cur >= lim) THEN
15.         UPDATE t_photo_folder
16.         SET disabled = TRUE
17.         WHERE photo_folder_id = pfID;
18.         RETURN NULL;
18. END IF;
19.
20. RETURN NULL;
21. END;

J'obtient l'erreur suivante :

2009-08-18 10:22:49 ERROR  : ERREUR:  dépassement de limite (en profondeur) de la pile
HINT:  Augmenter le paramètre « max_stack_depth » après vous être assuré que la
limite de profondeur de la pile de la plateforme est adéquate.
CONTEXT:  instruction SQL « UPDATE t_photo_folder SET disabled = TRUE WHERE photo_folder_id =  $1  »
PL/pgSQL function "change_folder_status" line 15 at SQL statement
instruction SQL « UPDATE t_photo_folder SET disabled = TRUE WHERE photo_folder_id =  $1  »
PL/pgSQL function "change_folder_status" line 15 at SQL statement
instruction SQL « UPDATE t_photo_folder SET disabled = TRUE WHERE photo_folder_id =  $1  »
PL/pgSQL function "change_folder_status" line 15 at SQL statement
instruction SQL « UPDATE t_photo_folder SET disabled = TRUE WHERE photo_folder_id =  $1  »
PL/pgSQL function "change_folder_status" line 15 at SQL statement
instruction SQL « UPDATE t_photo_folder SET disabled = TRUE WHERE photo_folder_id =  $1  »

La table t_photo_folder
{
photo_folder_id INTEGER
name VARCHAR2
current_size INTEGER
files_limit INTEGER
disabled BOOLEAN
}

J'ai essayé de modifier la colonne files_limit avec mon UPDATE et de la changer par une autre valeur et cela fonctionne sans problème. J'ai pas de soucis aussi avec les intructions INSERT et DELETE.

Donc je ne comprends pas du tout d'où vient le problème. Merci d'avance de votre aide.

Pied de page des forums

Propulsé par FluxBB