PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Untuk mengabaikan hasil SEBELUM PEMICU PostgreSQL?

Pertama-tama, Anda harus meneruskan variabel baris dalam BEFORE pemicu. Melewati NULL membatalkan operasi untuk baris:

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;

Saya mendemonstrasikan penggunaan RETRUN NULL dalam AFTER memicu dalam jawaban saya sebelumnya . Anda tidak dapat melakukan hal yang sama untuk BEFORE pemicu. Manual:

Masih ada lagi. Baca manualnya.

Tetapi karena Anda melewati dua larik 1 dimensi alih-alih satu larik 2 dimensi sekarang, Anda perlu menyesuaikan logika pemicu Anda:

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

Adalah tanggung jawab Anda bahwa kedua larik memiliki jumlah elemen yang sama.
Fungsi yang mengubah pemicu dapat terlihat seperti ini sekarang:

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

Anda perlu memahami dasar-dasar SQL, PL/pgSQL, fungsi pemicu, dan penanganan array sebelum menggunakan desain otomatis lanjutan ini.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan beberapa skema PostgreSQL dengan model Rails

  2. Flask dan SQLAlchemy menyebabkan banyak IDLE dalam koneksi transaksi di PostgreSQL

  3. pgbackup di Heroku tidak ditemukan

  4. AssertionError:koneksi database tidak diatur ke UTC

  5. Rails bergabung dengan kueri