Annonce
Pour sa 21ème année, l’association GeoRezo a toujours besoin de vous !
10€ = 1 mois de frais bancaires ; 15€ = 12 mois de nom de domaine ; 30€ = 1 semaine de location des serveurs …
Retrouver nos membres bienfaiteurs
#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: 431
Re: Trigger non fonctionnel PostgreSQL 13
--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