PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Aby zignorować wynik w BEFORE TRIGGER PostgreSQL?

Przede wszystkim musisz przekazać zmienną wiersza w BEFORE cyngiel. Przekazywanie NULL anuluje operację dla wiersza:

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;

Zademonstrowałem użycie RETRUN NULL w AFTER wyzwalacz w mojej poprzedniej odpowiedzi . Nie możesz zrobić tego samego dla BEFORE cyngiel. Podręcznik:

Jest więcej. Przeczytaj instrukcję.

Ale ponieważ teraz przekazujesz dwie tablice jednowymiarowe zamiast jednej tablicy dwuwymiarowej, musisz dostosować logikę wyzwalania:

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

Twoim obowiązkiem jest, aby obie tablice miały taką samą liczbę elementów.
Funkcja zmieniająca wyzwalacz może teraz wyglądać tak:

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

Musisz zrozumieć podstawy SQL, PL/pgSQL, funkcje wyzwalaczy i obsługę tablic przed użyciem tego zaawansowanego zautomatyzowanego projektu.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. drukowanie wartości zmiennej w postgresql

  2. Jak wykonać zapytanie wyszukiwania na wartości kolumny zawierającej ciąg z wartościami oddzielonymi przecinkami?

  3. Przewodnik po Pgpool dla PostgreSQL:część druga

  4. Oracle DBMS_LOB.WRITEAPPEND do konwersji Postgres

  5. Zapytanie Django z order_by, differ i limit na Postgresql