Ich weiß, was du sagen möchtest, aber: die Aussage der PostgreSQL Funktion ist richtig. Die Zeilen werden tatsächlich aktualisiert - unabhängig davon was dort vorher stand.Code:test=# create table affected_test (id serial, data text); NOTICE: CREATE TABLE will create implicit sequence "affected_test_id_seq" for serial column "affected_test.id" CREATE TABLE test=# insert into affected_test (data) values ('irgendein Inhalt'); INSERT 0 1 test=# update affected_test set data='neuer Inhalt' where id=2; UPDATE 0 test=# update affected_test set data='neuer Inhalt' where id=1; UPDATE 1
Gut, du willst das also umgehen: du musst vorher prüfen ob sich die Daten ändern. Das wird erstens etwas umfangreicher und zweitens kostet das Performance:
Gut, ausprobieren:Code:CREATE TABLE affected_test (id serial, data text); INSERT INTO affected_test (data) VALUES ('irgendein Inhalt'); CREATE OR REPLACE FUNCTION update_test () RETURNS TRIGGER AS $$ DECLARE BEGIN IF TG_OP = 'UPDATE' THEN IF NEW.id = OLD.id AND NEW.data = OLD.data THEN -- keine Datenaenderung RETURN NULL; END IF; RETURN NEW; END IF; IF TG_OP = 'INSERT' THEN RETURN NEW; END IF; IF TG_OP = 'DELETE' THEN RETURN OLD; END IF; -- wird nicht erreicht RETURN NEW; END; $$ LANGUAGE 'plpgsql'; CREATE TRIGGER update_test_trigger BEFORE INSERT OR UPDATE OR DELETE ON affected_test FOR EACH ROW EXECUTE PROCEDURE update_test();
Passt.Code:test=# update affected_test set data='neuer Inhalt' where id=1; UPDATE 1 test=# update affected_test set data='neuer Inhalt' where id=1; UPDATE 0



LinkBack URL
About LinkBacks
Zitieren


Lesezeichen