Auf Thema antworten

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.


Zurück
Oben