sql >> Database teknologi >  >> RDS >> PostgreSQL

Sådan undgår du sløjfetriggeropkald i PostgreSQL 9.2.1

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.




  1. Måling af forespørgselsydeevne:Eksekveringsplan forespørgselsomkostninger vs. brugt tid

  2. DevOps:DBA eller udvikler – Få balancen i orden

  3. Sådan erstattes null-værdier med ukendt i Select Statement i SQL Server - SQL Server / TSQL Tutorial Del 111

  4. Erklæring og indstilling af variabler i en udvalgt erklæring