Vous n'êtes pas identifié(e).
Pages : 1
Bonjour,
Je suis complètement nouveau dans l'utilisation de PostgreSQL (et de BD de manière général), j'aimerai mettre en place un trigger pour créer une table d'historique (h_table) d'une autre table (table).
Donc voici le code de mon trigger:
CREATE TRIGGER t_histo_table AFTER INSERT OR UPDATE
ON table FOR EACH ROW
EXECUTE PROCEDURE p_histo_table();
et voici la fonction associée:
CREATE OR REPLACE FUNCTION p_histo_table() RETURNS NULL AS $$
INSERT INTO h_table (
id,
valeur,
date_historique)
SELECT
id,
valeur,
sysdate
FROM table
WHERE id = NEW.id;
$$ LANGUAGE SQL;
Or dans pgAdminIII quand je cherche à déclarer ma fonction (avant le trigger biensur) il me renvoie l'erreur suivante:
ERREUR: erreur de syntaxe sur ou près de « AS »
LINE 1: ...EATE OR REPLACE FUNCTION P_HISTO_MESURE() RETURNS NULL AS $$
^
********** Erreur **********
ERREUR: erreur de syntaxe sur ou près de « AS »
État SQL :42601
Caractère : 58
Est-ce que vous avez une idée de pourquoi ça ne fonctionne pas ?
Qu'elle est mon erreur de syntaxe ?
D'avance merci.
Hors ligne
1. NULL n'est pas un type de données, donc indiquer NULL comme paramètre du RETURNS me semble hautement suspect. D'autre part, une fonction trigger doit renvoyer le type trigger.
2. Je ne crois pas qu'il soit possible d'écrire une procédure trigger en SQL. Utilisez plutôt pl/pgsql.
Guillaume.
Hors ligne
Bonjour,
Merci pour votre réponse.
J'ai donc modifié ma fonction comme suis:
CREATE OR REPLACE FUNCTION p_histo_table() RETURNS trigger AS $$
DECLARE
curtime TIMESTAMP WITH TIME ZONE;
BEGIN
INSERT INTO h_table (
id,
valeur,
date_historique)
VALUES (
NEW.id,
NEW.valeur,
curtime)
RETURN NEW;
END;
$$ LANGUAGE 'plpgsql';
Et là j'ai l'erreur:
ERREUR: le langage « plpgsql » n'existe pas
HINT: Utiliser CREATE LANGUAGE pour charger le langage dans la base de données.
********** Erreur **********
ERREUR: le langage « plpgsql » n'existe pas
État SQL :42704
Astuce : Utiliser CREATE LANGUAGE pour charger le langage dans la base de données.
Ce qui est assez étrange puisque d'après la doc ce langage semble être intégré dans le gbd...
J'ai une version 8.3.7 de PostGre, et je lance mon script avec pgAdmin III 1.8.4
Hors ligne
J'ai remodifié ma requête comme ceci:
CREATE LANGUAGE plpgsql;
CREATE OR REPLACE FUNCTION P_HISTO_MESURE() RETURNS trigger AS $$
DECLARE
curtime TIMESTAMP WITH TIME ZONE;
BEGIN
INSERT INTO h_mesure (
id,
valeur,
date_historique)
VALUES (
NEW.id,
NEW.valeur,
curtime);
END;
$$ LANGUAGE 'plpgsql';
Et ça fonctionne (enfin) \o/.
Par contre, une question supplémentaire, doit-on à chaque script faire le CREATE LANGUAGE, ou une fois que c'est fait dans la base il n'y a plus besoin de le faire ?
Hors ligne
Une fois par base uniquement.
Marc.
Hors ligne
Une fois par base uniquement.
A la bonne heure !
Merci beaucoup !
Hors ligne
Et que fait-on lorsque que l'on est pas super-utilisateur ? car CREATE LANGUAGE réclame ce droit
Hors ligne
On n'a pas de solution, à part demander à un super utilisateur.
Marc.
Hors ligne
Pour chaque insert ou salect, il faut utiliser une boucle for.
j'espere que ce script pourra t'aider, j'ai supprimé la requete car confidentielle.
mais n'hesite pas à me soliciter en cas de difficulté.
CREATE OR REPLACE FUNCTION fat_export_fonc(INT, "text", "text")
RETURNS SETOF fat_export_type AS
$BODY$
DECLARE
mon_record fat_export_type;
BEGIN
FOR mon_record IN
EXECUTE 'SELECT ...............................................';
LOOP
RETURN NEXT mon_record ;
END LOOP;
RETURN;
END $BODY$
LANGUAGE 'plpgsql';
Hors ligne
Cela ne change rien à la question : il faut toujours avoir PLPgSQL, qui n'est pas installé par défaut. Et l'installer demande des droits super utilisateur. Ce ne sera plus le cas en 9.0, puisque plpgsql sera installé par défaut.
Marc.
Hors ligne
Pages : 1