Endlosschleife after update

Hallo.
Ich habe ein Problem mit einem Trigger after update.

Nehmen wir an ich habe eine Tabelle mit den Spalten
Titel | Inhalt | Suchindex

Wenn sich der Inhalt ändert soll sich der Suchindex neu erzeugt werden.
Allerdings führt das dann zu einer Endlosschleife.
Kann ich irgendwie sagen, dass eine Änderung im Suchindex kein update auslösen soll?

danke!
Franz

Wie, nach welcher Regel?

Allerdings führt das dann zu einer Endlosschleife.

Wo?

Kann ich irgendwie sagen, dass eine Änderung im Suchindex kein update auslösen soll?

Ja, OLD und NEW vergleichen.


Andreas



test=# create table franz (id int, name text, idx text);
CREATE TABLE
test=*# create or replace function f_franz() returns trigger as $$begin if ((NEW.id != OLD.id) or (NEW.name != OLD.name)) then NEW.idx:=NEW.id::text || NEW.name; end if; return NEW; end; $$ language plpgsql;
CREATE FUNCTION
test=*# create trigger trg_franz before update on franz for each row execute procedure f_franz();
CREATE TRIGGER
test=*# insert into franz values (1, 'bla', NULL);
INSERT 0 1
test=*# update franz set name='blablafoo' where id=1;
UPDATE 1
test=*# select * from franz;
 id |   name    |    idx
----+-----------+------------
  1 | blablafoo | 1blablafoo
(1 row)

Hilft das?

Andreas

hallo akretschmer.

Danke für deine Hilfe.
Das schaut gut aus.

Ich werd es gleich ausprobieren.

lg
Franz

Davon abgesehen, daß das mit einem TRIGGER machbar ist: wenn die eine Spalte von einer oder mehreren anderen Spalten berechenbar ist, dann ist sowas ein schlechtes Design. Daher fragte ich bereits, nach welcher Regel Dein Suchindex zu berechnen ist. Möglicherweise willst Du keinen TRIGGER, sondern etwas anderes.

Andreas

Hallo.

Ich hätte noch ein kurze Frage zu dem Vergleich mit
NEW.name != OLD.name.
Wenn eine OLD Wert NULL ist funktioniert diese Abfrage ja nicht.
Gibt seine Möglichkeit das auch noch obzufragen.

lg
franz

Du kannst auf NULL prüfen, mit isnull.

Andreas

oder via:

coalesce(OLD.xxx, 0) != coalesce(NEW.xxx, 0)