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 29/11/2017 13:28:54

Baovola
Membre

Recuperation nom d'une table à partir de TG_TABLE_NAME

Bonjour,

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.

Hors ligne

#2 29/11/2017 14:49:19

jmarsac
Membre

Re : Recuperation nom d'une table à partir de TG_TABLE_NAME

Bonjour,
Difficile de vous aider sans plus de précisions.
Vous devriez poster le code de votre fonction.

Hors ligne

#3 29/11/2017 23:31:57

Baovola
Membre

Re : Recuperation nom d'une table à partir de TG_TABLE_NAME

Ok vous avez raison, mais au fait j'aimerais seulement récuperer le nom d'une table juste après sa modification:

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.

Hors ligne

#4 29/11/2017 23:46:08

gleu
Administrateur

Re : Recuperation nom d'une table à partir de TG_TABLE_NAME

Vous entendez quoi par "ça ne marche pas" ? il y a une erreur à la création de la fonction ? si oui, laquelle ? il y a une erreur à l'exécution de la fonction ? si oui, laquelle ? le résultat obtenu n'est pas celui que vous attendiez ? si oui, quel résultat obtenez-vous et qu'attendiez vous comme résultat ? toujours dans ce cas, peut-on avoir un exemple complet ?

Tout ça, on ne peut pas le deviner. Il faut présenter complètement le problème que vous avez.


Guillaume.

Hors ligne

#5 30/11/2017 00:35:12

Baovola
Membre

Re : Recuperation nom d'une table à partir de TG_TABLE_NAME

Je voudrais récupérez le nom de schéma et nom de la table sur laquelle la modification est survenue



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 .

Hors ligne

#6 02/12/2017 09:26:25

gleu
Administrateur

Re : Recuperation nom d'une table à partir de TG_TABLE_NAME

Vous vous rendez compte quand même que vous n'avez répondu à pratiquement aucune de mes questions ? pourrait-on avoir au moins le schéma de la table historique.historique_points et de la table sur laquelle se trouve le trigger et du trigger lui-même ? c'est le minimum pour qu'on puisse tester.


Guillaume.

Hors ligne

#7 29/04/2018 03:09:21

dksoft
Membre

Re : Recuperation nom d'une table à partir de TG_TABLE_NAME

Bonjour, j'ai le même problème ou presque.
La fonction doit permettre après chaque insertion, de donner à la sequence, la valeur du  dernier identifiant de la table .
Dans la fonction je fait reference à la table qui est à la source du trigger (table cercle dans ce exemple) à travers TG_TABLE_NAME
Le trigger appel cette fonction avec en paramettre le nom de la sequence de la table cercle
La fonction et le trigger sont crées correctement.
Mais lors d'une insertion dans la table cercle, j'ai message d'erreur, indiquant que TG_TABLE_NAME n'existe pas ou...........
Mais lorsque je remplace TG_TABLE_NAME par le nom de la table 'cercle', tout marche correctement

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!

Hors ligne

#8 29/04/2018 08:58:55

gleu
Administrateur

Re : Recuperation nom d'une table à partir de TG_TABLE_NAME

Vous ne pouvez pas utiliser la variable TG_TABLE_NAME (et toute autre variable) pour donner le nom d'un objet dans une requête. Il faut passer par une requête dynamique. Voir https://docs.postgresql.fr/10/plpgsql-s … cuting-dyn pour plus de détails.


Guillaume.

Hors ligne

Pied de page des forums