sql >> データベース >  >> RDS >> PostgreSQL

PostgreSQLのBEFORETRIGGERの結果を無視するには?

    まず、行変数を 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に対して同じことを行うことはできません 引き金。 マニュアル:

    もっとある。マニュアルを読んでください。

    ただし、現在は1つの2次元配列ではなく2つの1次元配列を渡しているため、トリガーロジックを調整する必要があります。

    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. MySQLに書き込むときにTextAreaからの改行を保持する

    2. PostgreSQL-浮動小数点数の丸め

    3. MySQLに画像を送信するAndroidアプリケーション

    4. 値が暗黙的に日付形式に変換される方法を理解できません