unverständlich, was Du mir sagen willst. Demo:
[code]
edb=# create table demo(id int primary key, val int);
CREATE TABLE
edb=*# create or replace function check_change() returns trigger as $$begin if new.val = old.val then return null; else return new; end if; end;$$language plpgsql;
CREATE FUNCTION
edb=*# create trigger trg1 before update on demo for each row when (new.val = old.val) execute procedure check_change();
CREATE TRIGGER
edb=*# insert into demo values (1,10);
INSERT 0 1
edb=*# insert into demo values (2,20);
INSERT 0 1
edb=*# select ctid,* from demo;
ctid | id | val
-------+----+-----
(0,1) | 1 | 10
(0,2) | 2 | 20
(2 rows)
[/code]
Bis hierhin klar? die ctid ist eine versteckte Spalte, die die physische Position des datensatzes angibt. Jetzt ein Update, welches den val-Wert ändert:
[code]
edb=*# update demo set val = 11 where id = 1;
UPDATE 1
edb=*# select ctid,* from demo;
ctid | id | val
-------+----+-----
(0,2) | 2 | 20
(0,3) | 1 | 11
(2 rows)
[/code]
wir haben für id=1 den Wert von val verändert, daher auch eine neu ctid.
[code]
edb=*# update demo set val = 20 where id = 2;
UPDATE 0
edb=*# select ctid,* from demo;
ctid | id | val
-------+----+-----
(0,2) | 2 | 20
(0,3) | 1 | 11
(2 rows)
edb=*#
[/code]
hier haben wir für id=2 den selben Wert für val erneut gesetzt. Der Trigger verhindert aber die reale Ausführung des Updates - das spart der DB letztendlich schreibarbeit und, falls eine Replikation im Einsatz ist, Netzwerktraffic.
PS.: die Trigger-Funktion könnte man noch kürzen, die erneute Prüfung auf new.val = old.val ist unnötig, da bereits via when-condition geprüft.