PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Để bỏ qua kết quả BEFORE TRIGGER của PostgreSQL?

Trước hết, bạn cần chuyển biến hàng trong BEFORE Kích hoạt. Chuyển NULL hủy thao tác đối với hàng:

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;

Tôi đã chứng minh việc sử dụng RETRUN NULL trong một AFTER kích hoạt trong câu trả lời trước của tôi . Bạn không thể làm tương tự cho một BEFORE Kích hoạt. Hướng dẫn:

Có nhiều. Đọc hướng dẫn.

Nhưng vì bây giờ bạn đang chuyển hai mảng 1 chiều thay vì một mảng 2 chiều, bạn cần điều chỉnh logic kích hoạt của mình:

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

Trách nhiệm của bạn là cả hai mảng đều có cùng số phần tử.
Hàm thay đổi trình kích hoạt có thể trông giống như sau:

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

Bạn cần hiểu cơ bản về SQL, PL / pgSQL, các hàm kích hoạt và xử lý mảng trước khi sử dụng thiết kế tự động nâng cao này.




  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 có giữ các trình thông dịch pl * của nó được tải liên tục không?

  2. Tính toán sự khác biệt của các ngày trong Postgresql

  3. Cấp đặc quyền cho tất cả người dùng, hiện tại và tương lai

  4. Xuất và nhập kết xuất bảng (.sql) bằng pgAdmin

  5. Sắp xếp dấu thời gian (bao gồm cả tương lai) theo khoảng cách tuyệt đối từ bây giờ