Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#1 Wed 31 August 2022 06:22

La_methode
Juste Inscrit !
Date d'inscription: 20 Aug 2018
Messages: 5

Trigger non fonctionnel PostgreSQL 13

Bonjour à tous,
je suis un peu débutant en sql (postgreSQL), j'ai besoin d'automatiser la mise à jour de certains champs de table d'une bases de données.
La particularité de ces tables est qu'elle se retrouve sous différents schémas alors j'ai décidé d'inscrire dans le code TG_TABLE_NAME et TG_SCHEMA_NAME afin d'indexer directement la table ou le schéma que visera le trigger.
Le code que j'ai écrit s'exécute parfaitement mais lorsqu'une action est faite sur une des tables, les champs sensés être mises à jour automatiquement restent toujours nul.
Ci dessous mon code

CREATE OR REPLACE FUNCTION downhole_position()
RETURNS TRIGGER
language 'plpgsql'
AS $$
BEGIN
--la table existe dans différents schéma de la base de données--
--lorsqu'une insertion ou mise à jour est effectuée sur une table--
    IF (TG_TABLE_NAME='INSERT' OR TG_TABLE_NAME='UPDATE')
--exécuter une requête de mise à jour sur des champs spécifiques--
--jointure interne à réaliser--
    THEN
        UPDATE TG_TABLE_NAME
            SET
                  New."X_from"="mEasting"+(New."mFrom"*cos(radians("Dip"))*sin(radians(180-"Azimuth"))),
                  New."Y_from"="mNorthing"-(New."mFrom"*cos(radians("Dip"))*sin(radians("Azimuth"-90))),           
                  New."X_to"="mEasting"+(New."mTo"*cos(radians("Dip"))*sin(radians(180-"Azimuth"))),
                  New."Y_to"="mNorthing"-(New."mTo"*cos(radians("Dip"))*sin(radians("Azimuth"-90)))
        FROM TG_TABLE_NAME as d
        INNER JOIN TG_TABLE_SCHEMA."DHCollar" as b
        ON d."HoleID"=b."HoleID";
    END IF;
RETURN NEW;
END
$$;

CREATE TRIGGER Downhole_Data_position
AFTER INSERT OR UPDATE
ON "Daloa"."TestDHLitho"
FOR EACH ROW
EXECUTE PROCEDURE downhole_position();


Merci de m'aider.

Dernière modification par La_methode (Wed 31 August 2022 06:43)

Hors ligne

 

#2 Wed 31 August 2022 07:15

p.jeremie
Participant assidu
Lieu: Valence
Date d'inscription: 10 Sep 2017
Messages: 427

Re: Trigger non fonctionnel PostgreSQL 13

La_methode a écrit:

--lorsqu'une insertion ou mise à jour est effectuée sur une table--
    IF (TG_TABLE_NAME='INSERT' OR TG_TABLE_NAME='UPDATE')
--exécuter une requête de mise à jour sur des champs spécifiques--
--jointure interne à réaliser--
    THEN
        UPDATE TG_TABLE_NAME
            SET


Pour ton if tu voulais mettre TG_OP='INSERT'  or TG_OP='UPDATE' j'imagine?
Et pour ton update, tu dois préciser le schéma sinon ça cherchera dans le schéma public par défaut.

Hors ligne

 

#3 Wed 31 August 2022 08:03

La_methode
Juste Inscrit !
Date d'inscription: 20 Aug 2018
Messages: 5

Re: Trigger non fonctionnel PostgreSQL 13

Ah d'accord donc pour signifier une mise à jour qui s'effectue dans la base de donnée quelque soit le type du champ, j'aurais dû écrire TG_OP.

Pour le Update je vais donc signifier le schéma.
Mais une question subsiste, comment vais je faire alors si je veux utiliser cette fonction pour plusieurs tables et différents schémas ?
Faut-il absolument que j'écrive une fonction pour chaque table (donc pour chaque schéma)?

Hors ligne

 

#4 Wed 31 August 2022 09:31

Nicolas Ribot
Membre
Lieu: Toulouse
Date d'inscription: 9 Sep 2005
Messages: 1554

Re: Trigger non fonctionnel PostgreSQL 13

Bonjour,


NEW fait référence a la ligne courante de la table sur laquelle agit le trigger, vous ne pouvez pas faire:

UPDATE TG_TABLE_NAME
            SET
                  New."...."

Si le trigger agit sur tg_table_name, il faut faire un NEW.col = .... directement. Faire un update relance le trigger => boucle sans fin

De meme, si vous modifiez la table sur laquelle agit le trigger, le trigger doit etre un before trigger, pas after.

Pas tres clair ce que vous voulez faire: vous auriez un exemple ? (et oui, une seule fonction peut agir sur autant de tables que l'on veut)

Nicolas

Hors ligne

 

#5 Wed 31 August 2022 22:41

La_methode
Juste Inscrit !
Date d'inscription: 20 Aug 2018
Messages: 5

Re: Trigger non fonctionnel PostgreSQL 13

Salut Nicolas, je dispose d'une base de données contenant plusieurs schémas. Chaque schéma contient les même tables.
Il se trouve que j'ai besoin de d'automatiser le calcul de certains champ d'une table Y (j'ai au total 3 tables de ce type par schéma). Ce calcule a besoin de données qui se trouve dans une table X appartenant au même schéma que la table X.
Ne voulant pas définir un trigger pour chaque schéma et pour chaque table, je recherche un code qui me permettrait de faire la manœuvre.
J'ai donc introuduit les termes TG_TABLE_NAME et TG_SCHEMA_NAME car pensant qu'il peut a eux seul indexer le schéma et la table à laquelle qui sera indexée dans le trigger.

Hors ligne

 

#6 Thu 01 September 2022 11:34

La_methode
Juste Inscrit !
Date d'inscription: 20 Aug 2018
Messages: 5

Re: Trigger non fonctionnel PostgreSQL 13

J'ai fait référence à UPDATE car à cause de la jointure entre les table X et Y. je ne savais pas que je pouvais me passer de cette commande puisque je pense devoir mixer les deux tables avant d'effectuer le calcul.

Hors ligne

 

Pied de page des forums

Powered by FluxBB