sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man undviker att ringa utlösare i PostgreSQL 9.2.1

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 , eller utm_northing , sedan wgs_84_latitude , wgs84_longitude och yt_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 eller wgs84_longitude , sedan alla utm_ fält uppdateras, liksom 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();

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.




  1. Hur man skapar Not Null-begränsning på kolumn i SQL Server-tabell - SQL Server / T-SQL självstudie del 51

  2. Hur man ändrar teckenuppsättning från latin1 till UTF8 i MySQL

  3. 6 sätt att kontrollera din MariaDB-version

  4. Ansluter postgresql med sqlalchemy