Du kan gøre dette med standardudløsere BEFORE UPDATE OF ... ON ...
.
Manualen om CREATE TRIGGER
informerer:
Udløseren udløses kun, hvis mindst en af de anførte kolonner er nævnt som et mål for UPDATE-kommandoen.
Og længere nede:
En kolonnespecifik trigger (en defineret ved hjælp af OPDATERING AF kolonnenavnsyntaks) udløses, når nogen af dens kolonner er angivet som mål i OPDATERING-kommandoens SET-liste. Det er muligt for en kolonnes værdi at ændre sig, selv når triggeren ikke udløses, fordi ændringer foretaget af rækkens indhold af FØR OPDATERING udløsere ikke tages i betragtning.
Fed understregning min. Så ingen uendelige loops, fordi opdateringerne inde i triggeren ikke påkalder en anden trigger.
Testcase
Opret testtabel (forenklet, uden irrelevante rækker):
CREATE TABLE soil_samples (
pgid SERIAL PRIMARY KEY
,utm_zone integer
,utm_easting integer
,utm_northing integer
,wgs84_longitude double precision
,wgs84_latitude double precision
,yt_albers_geom double precision
);
Dummy-udløser til dit første krav:
Når en opdatering er udført til utm_zone
, utm_easting
, eller utm_northing
, derefter wgs_84_latitude
, wgs84_longitude
og yt_albers_geom
opdateres af en trigger.
CREATE OR REPLACE FUNCTION trg_upbef_utm() RETURNS trigger AS
$func$
BEGIN
NEW.wgs84_latitude := NEW.wgs84_latitude + 10;
NEW.wgs84_longitude := NEW.wgs84_longitude + 10;
NEW.yt_albers_geom := NEW.yt_albers_geom + 10;
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER upbef_utm
BEFORE UPDATE OF utm_zone, utm_easting, utm_northing ON soil_samples
FOR EACH ROW
WHEN (NEW.utm_zone IS DISTINCT FROM OLD.utm_zone OR
NEW.utm_easting IS DISTINCT FROM OLD.utm_easting OR
NEW.utm_northing IS DISTINCT FROM OLD.utm_northing) -- optional
EXECUTE PROCEDURE trg_upbef_utm();
WHEN
klausul er valgfri. Forhindrer udløseren i at udløse, når ingen værdi faktisk har ændret sig.
Dummy-udløser til dit andet krav:
Når en opdatering er udført til wgs84_latitude
eller wgs84_longitude
, derefter alle utm_
felter opdateres, samt yt_albers_geom
.
CREATE OR REPLACE FUNCTION trg_upbef_wgs84() RETURNS trigger AS
$func$
BEGIN
NEW.utm_zone := NEW.utm_zone + 100;
NEW.utm_easting := NEW.utm_easting + 100;
NEW.utm_northing := NEW.utm_northing + 100;
NEW.yt_albers_geom := NEW.yt_albers_geom + 100;
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER upbef_wgs84
BEFORE UPDATE OF wgs84_latitude, wgs84_longitude ON soil_samples
FOR EACH ROW
WHEN (NEW.wgs84_latitude IS DISTINCT FROM OLD.wgs84_latitude OR
NEW.wgs84_longitude IS DISTINCT FROM OLD.wgs84_longitude) -- optional
EXECUTE PROCEDURE trg_upbef_wgs84();
Udløser for tredje krav i denne retning ...
Test
INSERT INTO soil_samples VALUES (1, 1,1,1, 2,2, 3) RETURNING *;
Udløs upbef_utm
:tom opdatering, der sker ikke noget:
UPDATE soil_samples SET utm_zone = 1 RETURNING *;
Opdatering med faktisk ændring:Den anden trigger upbef_wgs84
udløses ikke på UPDATE OF utm_zone
!
UPDATE soil_samples SET utm_zone = 0 RETURNING *;
Udløs upbef_wgs84
:
UPDATE soil_samples SET wgs84_latitude = 0 RETURNING *;
-> SQLfiddle-demo.