sql >> Databáze >  >> RDS >> PostgreSQL

Ignorovat výsledek v BEFORE TRIGGER PostgreSQL?

Nejprve musíte předat proměnnou řádku v BEFORE spoušť. Předávání NULL zruší operaci pro řádek:

CREATE OR REPLACE FUNCTION insbef_events_function() 
  RETURNS TRIGGER AS 
$func$
DECLARE
   m int[]; 
BEGIN
   FOREACH m SLICE 1 IN ARRAY TG_ARGV[0]::int[]
   LOOP
      INSERT INTO events (measurement_id, event_index_start, event_index_end) 
      SELECT NEW.measurement_id, m[1], m[2];  -- Postgres array subscripts start with 1
   END LOOP;

      -- do something with _result ...

   RETURN NEW;  -- NULL would cancel operation in BEFORE trigger!
END 
$func$ LANGUAGE plpgsql;

Ukázal jsem použití RETRUN NULL v AFTER spustit v mé předchozí odpovědi . Totéž nemůžete udělat pro BEFORE spoušť. Příručka:

Je toho víc. Přečtěte si příručku.

Ale protože nyní předáváte dvě jednorozměrná pole namísto jednoho dvourozměrného pole, musíte upravit logiku spouštění:

CREATE OR REPLACE FUNCTION insbef_events_function() 
    LANGUAGE plpgsql RETURNS TRIGGER AS 
$func$
DECLARE
   a1 int[] := TG_ARGV[1]::int[];
   a2 int[] := TG_ARGV[2]::int[];
BEGIN
   FOR i in array_lower(a1, 1) .. array_upper(a1, 1)
   LOOP
      INSERT INTO events (measurement_id, event_index_start, event_index_end) 
      SELECT NEW.measurement_id  -- or TG_ARGV[0]::int instead?
           , a1[i], a2[i];
   END LOOP;

   RETURN NEW;  -- NULL would cancel operation in BEFORE trigger!
END 
$func$;

Je vaší odpovědností, aby obě pole měla stejný počet prvků.
Funkce měnící spouštěč by nyní mohla vypadat takto:

CREATE OR REPLACE FUNCTION f_create_my_trigger_events(_arg1 int, _arg2 text, _arg3 text)
  LANGUAGE plpgsql RETURNS void AS
$func$
BEGIN
   EXECUTE format(
    $$DROP TRIGGER IF EXISTS insbef_ids ON measurements; -- on measurements ..
      CREATE TRIGGER insbef_ids
      BEFORE INSERT ON measurements  -- .. according to previous posts!!
      FOR EACH ROW EXECUTE PROCEDURE insbef_events_function(%s, %L, %L)$$
    , _arg1
    , translate(_arg2, '[]', '{}')
    , translate(_arg3, '[]', '{}')
   );
END
$func$;

Před použitím tohoto pokročilého automatizovaného návrhu musíte porozumět základům SQL, PL/pgSQL, spouštěcím funkcím a manipulaci s poli.




  1. Jak mohu zastavit běžící dotaz MySQL?

  2. Hodnota pole spojit na řetězec v SQL Server

  3. Spouštění Vites a MySQL pomocí ClusterControl

  4. vložit všechna data $_POST do mysql pomocí PHP?