Hello, 

In a trigger body, is there a simple way to know if a column value has been 
explicitely modified ? 
Explicitely modified ; in others words, typically indicated in the SET clause 
of the UPDATE. 
A simple way ; I mean without analysing the SQL statement which can be very 
difficult according to the statement. 

# My trigger function executed by trigger BEFORE UPDATE ON a table tb (with 
columns id, c2, c3 ; of integer type) FOR EACH ROW : 
CREATE OR REPLACE FUNCTION func_tg_upd() 
RETURNS trigger LANGUAGE plpgsql 
AS $function$ 
BEGIN 
if NEW.c2 != 1 
then 
NEW.c2 := 0 ; 
end if; 
return NEW; 
END; 
$function$ 
; 

# Actions of the trigger 
UPDATE tb 
SET c 2 =2 
WHERE ... -- old c2 value can be 2 or another value 
; 
=> c2 will be changed to 0 by the trigger, OK , because I explicitely indicated 
the new value of c2 to a value different from 1. 
The the old value of c2 could be different or not. 
Example : 
TABLE tb ; 
id | c2 | c3 
-----+----+---- 
100 | 1 | 2 

UPDATE tb 
SET c2=2 
; 
TABLE tb ; 
id | c2 | c3 
-----+----+---- 
100 | 0 | 2 

---------- ---------- ---------- ---------- ---------- 

UPDATE tb 
SET c 3 =3 
WHERE ... -- and c2=2 ( previous value of c2 is 2 ) 
; 
=> c2 will be changed to 0 by the trigger, but I don't want that action ( NOT 
OK for me ) because I didn't explicitely indicate the new value 2 to c2 . 
Example : 
TABLE tb ; 
id | c2 | c3 
-----+----+---- 
100 | 2 | 2 

UPDATE tb 
SET c3=3 
; 
TABLE tb ; 
id | c2 | c3 
-----+----+---- 
100 | 0 | 3 


Regards 
----- Météo-France ----- 
PALAYRET Jacques 
DCSC/GDC 
[email protected] 
Fixe : +33 561078319 

Reply via email to