PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Да игнорирате резултата в BEFORE TRIGGER на PostgreSQL?

Първо, трябва да предадете променливата на реда в BEFORE спусък. Подаване на NULL отменя операцията за реда:

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;

Демонстрирах използването на RETRUN NULL в AFTER тригер в предишния ми отговор . Не можете да направите същото за BEFORE спусък. Ръководството:

Има още. Прочетете ръководството.

Но тъй като сега предавате два едномерни масива вместо един двумерен масив, трябва да адаптирате логиката на задействане:

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

Ваша отговорност е двата масива да имат еднакъв брой елементи.
Функцията, променяща тригера, може да изглежда така сега:

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

Трябва да разберете основите на SQL, PL/pgSQL, тригерните функции и обработката на масиви, преди да използвате този усъвършенстван автоматизиран дизайн.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Филтърът TypeORM OneToMany в релации не влияе върху резултата

  2. Регистърът има ли значение, когато „автоматично“ зарежда данни от S3 в таблица Redshift?

  3. Не може да се стартира услугата postgresql на CentOS 7

  4. PostgreSQL:Как да обединим 3 таблици, сортирани по дата

  5. Репликация на Londiste с PostgreSQL 9.0