Voici mon code:
---2------creation de la table
CREATE TABLE public.cercle
(
id integer NOT NULL,
idregion integer,
code character varying(255) DEFAULT NULL::character varying,
)
WITH (
OIDS=FALSE
);
ALTER TABLE public.cercle
OWNER TO postgres;
--2-------creation de la fonction
CREATE OR REPLACE FUNCTION trigfunc()
RETURNS TRIGGER AS $$
DECLARE
arg_seq text;
arg_tab text;
i integer :=0;
BEGIN
-- arg_seq := TG_ARGV[0];
-- arg_tab := TG_ARGV[1];
SELECT INTO i max(id) from TG_TABLE_NAME;
PERFORM setval(TG_ARGV[0], i);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
--2-------creation du trigger
CREATE TRIGGER tg_get_last_cercle_id_seq
AFTER INSERT ON cercle
FOR EACH ROW EXECUTE PROCEDURE trigfunc('cercle_id_seq');
--message après l'execution d'une requete insert sur la table cercle
ERREUR: la relation « tg_table_name » n'existe pas
LINE 1: SELECT max(id) from TG_TABLE_NAME
^
QUERY: SELECT max(id) from TG_TABLE_NAME
CONTEXT: fonction PL/pgsql trigfunc(), ligne 11 à instruction SQL
********** Erreur **********
ERREUR: la relation « tg_table_name » n'existe pas
État SQL :42P01
Contexte : fonction PL/pgsql trigfunc(), ligne 11 à instruction SQL
Dans l'attente de vos réponse!!! Merci d'avance!
]]>C'est à dire que à partir de ---> TG_TABLE_SCHEMA||'.'||TG_TABLE_NAME je voulais avoir ce nom.
Cette fonction sera appelée lors de chaque modification des tables pour créer une table historique.
1- Mon objectif c'est de créer un enregistrement pour chaque modification pour n'importe quelle table
2- Comme j'ai 50 tables (qui ont des attributs spatials), j'ai créé 3 tables historiques pour chaque type de géométrie (ponctuel, zonal et linéaire)
3- A chaque modification ou suppression je déclenche ce fonction et maintenant pour que l'insertion dans la table historique passe, je veux le nom de la table sur laquelle la modification est survenue.
4- Jusqu'à présent ,je n'ai rien inséré dans ma table historique, et il semblait que la récupération du nom de table ne marche pas.
Je vous remercie .
]]>Tout ça, on ne peut pas le deviner. Il faut présenter complètement le problème que vous avez.
]]>CREATE OR REPLACE FUNCTION schema1.generer_historique_ponctuel()
RETURNS trigger AS
$BODY$
DECLARE
rec RECORD;
oldValue TEXT;
newValue TEXT;
BEGIN
IF (TG_OP = 'UPDATE') THEN
FOR rec IN
SELECT column_name, data_type
FROM information_schema.columns
WHERE
information_schema.columns.table_schema = TG_TABLE_SCHEMA
AND information_schema.columns.table_name = TG_TABLE_NAME
LOOP
EXECUTE 'SELECT ($1).' || rec.column_name || '::text' INTO newValue USING NEW;
EXECUTE 'SELECT ($1).' || rec.column_name || '::text' INTO oldValue USING OLD;
IF oldValue <> newValue THEN
INSERT INTO historique.historique_points ("id_objet", "date_modif","user_modif","attr_modif", "anc_val","geom", "operation_")
SELECT t."gid", now(), "current_user"(), rec.column_name, oldValue,"geom",TG_OP FROM TG_TABLE_SCHEMA||'.'||TG_TABLE_NAME AS t WHERE NEW."gid" = t."gid";
END IF;
END LOOP;
RETURN NEW;
END IF;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
Je vous remercie.
]]>J'aimerais récupérer dynamiquement le nom d'une table sur laquelle une modification est survenue (sur trigger bien sur) pour faire une historique.
J'ai utilisé le TG_TABLE_NAME mais ca ne marche pas, j'utilise la version 9.5.
Je vous remercie.
]]>