PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

PostgreSQL 9.2.1 . में लूपिंग ट्रिगर कॉल से कैसे बचें

आप इसे मानक ट्रिगर के साथ कर सकते हैं BEFORE UPDATE OF ... ON ... .
CREATE TRIGGER . पर मैनुअल सूचित करता है:

<ब्लॉकक्वॉट>

ट्रिगर केवल तभी सक्रिय होगा जब सूचीबद्ध स्तंभों में से कम से कम एक का उल्लेख UPDATE कमांड के लक्ष्य के रूप में किया गया हो।

और नीचे:

<ब्लॉकक्वॉट>

एक कॉलम-विशिष्ट ट्रिगर (कॉलम_नामसिंटैक्स के अद्यतन का उपयोग करके परिभाषित किया गया) तब सक्रिय होगा जब इसके किसी भी कॉलम को UPDATE कमांड की SET सूची में लक्ष्य के रूप में सूचीबद्ध किया जाएगा। किसी स्तंभ के मान के लिए ट्रिगर सक्रिय न होने पर भी बदलना संभव है, क्योंकि अद्यतन से पहले ट्रिगर द्वारा पंक्ति की सामग्री में किए गए परिवर्तनों पर विचार नहीं किया जाता है।

बोल्ड जोर मेरा। तो कोई अनंत लूप नहीं, क्योंकि ट्रिगर के अंदर के अपडेट किसी अन्य ट्रिगर को नहीं बुलाते हैं।

टेस्ट केस

परीक्षण तालिका बनाएं (सरलीकृत, अप्रासंगिक पंक्तियों के बिना):

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
);

आपकी पहली आवश्यकता के लिए डमी ट्रिगर:

<ब्लॉकक्वॉट>

जब utm_zone में अपडेट किया जाता है , utm_easting , या utm_northing , फिरwgs_84_latitude , wgs84_longitude , और yt_albers_geom एक ट्रिगर द्वारा अपडेट किया जाता है।

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 खंड वैकल्पिक है। ट्रिगर को सक्रिय होने से रोकता है जब वास्तव में कोई मान नहीं बदला है।

आपकी दूसरी आवश्यकता के लिए डमी ट्रिगर:

<ब्लॉकक्वॉट>

जब wgs84_latitude में अपडेट किया जाता है या wgs84_longitude , फिर आप सभीtm_ फ़ील्ड अपडेट किए जाते हैं, साथ ही 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();

इन पंक्तियों के साथ तीसरी आवश्यकता के लिए ट्रिगर ...

परीक्षा

INSERT INTO soil_samples VALUES (1, 1,1,1, 2,2, 3) RETURNING *;

ट्रिगर upbef_utm :खाली अपडेट, कुछ नहीं होता:

UPDATE soil_samples SET utm_zone = 1 RETURNING *;

वास्तविक परिवर्तन के साथ अपडेट करें:दूसरा ट्रिगर upbef_wgs84 UPDATE OF utm_zone पर सक्रिय नहीं होगा !

UPDATE soil_samples SET utm_zone = 0 RETURNING *;

ट्रिगर upbef_wgs84 :

UPDATE soil_samples SET wgs84_latitude = 0 RETURNING *;

-> SQLfiddle डेमो।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSql में डीबी मालिक का नाम प्राप्त करें

  2. Django अद्वितीय एक साथ बाधा विफलता?

  3. PostgreSQL JDBC नल स्ट्रिंग को एक बाइट के रूप में लिया गया

  4. सशर्त लीड/अंतराल समारोह PostgreSQL?

  5. यादृच्छिक पंक्तियों का चयन करने का सबसे अच्छा तरीका PostgreSQL