Du kan göra detta med standardutlösare BEFORE UPDATE OF ... ON ...
.
Handboken om CREATE TRIGGER
informerar:
Utlösaren aktiveras bara om minst en av de listade kolumnerna nämns som mål för kommandot UPDATE.
Och längre ner:
En kolumnspecifik trigger (en som definieras med UPDATE OF column_namesyntax) kommer att aktiveras när någon av dess kolumner listas som mål i UPDATE-kommandots SET-lista. Det är möjligt för en kolumns värde att ändras även när utlösaren inte aktiveras, eftersom ändringar som gjorts av radens innehåll av BEFORE UPDATE-utlösare inte beaktas.
Djärv betoning min. Så inga oändliga loopar, eftersom uppdateringarna inuti triggern inte anropar en annan trigger.
Testfall
Skapa testtabell (förenklat, utan irrelevanta rader):
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-utlösare för ditt första krav:
När en uppdatering görs till
utm_zone
,utm_easting
, ellerutm_northing
, sedanwgs_84_latitude
,wgs84_longitude
ochyt_albers_geom
uppdateras av en utlösare.
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 är valfri. Förhindrar att utlösaren aktiveras när inget värde faktiskt har ändrats.
Dummy-utlösare för ditt andra krav:
När en uppdatering görs till
wgs84_latitude
ellerwgs84_longitude
, sedan alla utm_
fält uppdateras, liksomyt_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();
Utlösare för tredje kravet längs dessa linjer ...
Testa
INSERT INTO soil_samples VALUES (1, 1,1,1, 2,2, 3) RETURNING *;
Utlösa upbef_utm
:tom uppdatering, ingenting händer:
UPDATE soil_samples SET utm_zone = 1 RETURNING *;
Uppdatering med faktisk ändring:Den andra utlösaren upbef_wgs84
kommer inte att aktiveras på UPDATE OF utm_zone
!
UPDATE soil_samples SET utm_zone = 0 RETURNING *;
Utlösa upbef_wgs84
:
UPDATE soil_samples SET wgs84_latitude = 0 RETURNING *;
-> SQLfiddle-demo.