Vous n'êtes pas identifié(e).
Hello,
je dois adapter des triggers DB2 pour PG (v10.17).
Sur l'exemple ci-dessous j'avais l'erreur :
ERROR: relation "t2" does not exist
Où : PL/pgSQL function toto.upd_t2_col1() line 3 at SQL statement
la table "t2" existe pourtant bien dans le schéma "toto" ?!
J'ai déjà adapté d'autres triggers sans avoir ce souci de qualification,
Alors pourquoi avec celui-ci ?
Merci pour vôtre aide.
create or replace function upd_t2_col1() returns trigger
language plpgsql
as $$
begin
update toto.t2
set ts_envoi = (case
when new.col1 = 1
then current_timestamp
else null
end)
where colid = new.colid;
return new;
end;
$$;
drop trigger if exists trig1 on t1;
create trigger trig1
after update of col1 on t1
for each row
when (
(new.col1!=old.col1)
or
(new.col1 is null and old.col1 is not null)
or
(new.col1 is not null and old.col1 is null)
)
execute procedure upd_t2_col1();
Dernière modification par OF (12/08/2021 13:01:38)
Hors ligne
S'il vous indique qu'une relation n'existe pas, c'est qu'il ne la trouve pas dans les schémas indiqués dans le search_path. Donc je suppose que le search_path n'était pas bon au moment du déclenchement du trigger.
Guillaume.
Hors ligne
Merci Guillaume,
vous avez éclairé ma lanterne !
J'utilise DBeaver pour effectuer mes tests et le schéma par défaut était redevenu "public" (suite à une fermeture/réouverture de l'outil je suppose), c'est taquin ! ;-)
Hors ligne
Si le schéma est explicite comme dans le code montré (UPDATE toto.t2), cette erreur ne devrait pas se produire.
D'abord parce que si le schéma est explicite le search_path n'est pas utilisé, et ensuite parce que le message d'erreur devrait dire que "toto.t2" n'existe pas, et non pas simplement "t2", en principe.
Sinon rien à voir avec le problème mais cette condition
(new.col1!=old.col1)
or
(new.col1 is null and old.col1 is not null)
or
(new.col1 is not null and old.col1 is null)
)
peut se simplifier en
new.col1 is distinct from old.col1
@DanielVerite
http://blog-postgresql.verite.pro/
Hors ligne
Ciao dverite,
j'ai mis dans l'exemple la fonction qui marchait (cad avec la qualification de la table), l'erreur se produisait avec une fonction sans cette qualification. Mais comme je le précise c'était dû au fonctionnement de DBeaver.
Merci bien pour l'astuce !
Hors ligne