2017-07-17 1 views
0

私はトリガーを返す以下の関数を持っていますが、時には失敗する可能性があります。トリガーがトリガーすると、すべてのデータがデータベースに挿入されなくなります。だから、私は例外をキャッチしたい、それは動作しません。以下のトリガーの例外をどのように捕捉しましたか?

ポストグルでどのように例外をキャッチすることが可能ですか?

CREATE OR REPLACE FUNCTION update_function() 
RETURNS TRIGGER 
AS 
'BEGIN 
UPDATE 
    "EVENT" 
SET 
    rules = (
          SELECT 
           string_agg(DISTINCT st ->> ''id'', '', '') AS rules 
          FROM 
           "JSON_STORAGE" aes, 
           jsonb_array_elements("EVENT_DATA" -> ''fields'' #> ''{Tracking}'') AS st 
          WHERE 
           (st ->> ''id'' LIKE ''rule_%'') AND 
           aes."EVENT_ID" = NEW."EVENT_ID") 
WHERE 
    NEW."EVENT_ID" = "EVENT"."EVENT_ID"; 


UPDATE 
    "EVENT" 
SET 
longitude = 
       SELECT 
        (CASE 
        WHEN (trim(both ''" '' FROM replace(regexp_replace("EVENT_DATA"-> ''fields'' -> ''custom_fields'' ->> ''device_data'', ''[\\]{2,}"([^,:])'', ''\1'', ''g''), ''\"'', ''"''))::json -> ''objects'' -> 0 -> ''data'' -> ''device_info_logs'' -> 0 ->> ''device_type'' = ''Android'') THEN 
         trim(both ''"'' FROM replace(regexp_replace("EVENT_DATA"-> ''fields'' -> ''custom_fields'' ->> ''inauth_device_data'', ''[\\]{2,}"([^,:])'', ''\1'', ''g''), ''\"'', ''"''))::json -> ''objects'' -> 0 -> ''data'' -> ''gps_location_logs'' -> 0 ->> ''location_wifi_longitude'' 
        else 
         trim(both ''"'' FROM replace(regexp_replace("EVENT_DATA"-> ''fields'' -> ''custom_fields'' ->> ''inauth_device_data'', ''[\\]{2,}"([^,:])'', ''\1'', ''g''), ''\"'', ''"''))::json -> ''objects'' -> 0 -> ''data'' -> ''gps_location_logs'' -> 0 ->> ''longitude'' 
        END), 
    latitude = 
       SELECT 
        (CASE 
        WHEN (trim(both ''" '' FROM replace(regexp_replace("EVENT_DATA"-> ''fields'' -> ''custom_fields'' ->> ''inauth_device_data'', ''[\\]{2,}"([^,:])'', ''\1'', ''g''), ''\"'', ''"''))::json -> ''objects'' -> 0 -> ''data'' -> ''device_info_logs'' -> 0 ->> ''device_type'' = ''Android'') THEN 
         trim(both ''"'' FROM replace(regexp_replace("EVENT_DATA"-> ''fields'' -> ''custom_fields'' ->> ''inauth_device_data'', ''[\\]{2,}"([^,:])'', ''\1'', ''g''), ''\"'', ''"''))::json -> ''objects'' -> 0 -> ''data'' -> ''gps_location_logs'' -> 0 ->> ''location_wifi_latitude'' 
        else 
         trim(both ''"'' FROM replace(regexp_replace("EVENT_DATA"-> ''fields'' -> ''custom_fields'' ->> ''inauth_device_data'', ''[\\]{2,}"([^,:])'', ''\1'', ''g''), ''\"'', ''"''))::json -> ''objects'' -> 0 -> ''data'' -> ''gps_location_logs'' -> 0 ->> ''latitude'' 
        END) 
       FROM 
        "JSON_STORAGE" aes 
       WHERE 
        aes."EVENT_ID" = NEW."EVENT_ID" AND 
        aes."EVENT_DATA"-> ''fields'' -> ''custom_fields'' ->> ''device_data'' LIKE ''%{%:%}%'' and 
        aes."EVENT_DATA"->''fields''->>''event_type''=''transaction_submission'' 
    WHERE 
     NEW."EVENT_ID" = "EVENT"."EVENT_ID" AND 
    "EVENT".ip_geo_longitude IS NULL AND 
    "EVENT".ip_geo_latitude IS NULL; 

exception when others then 
raise notice ''The transaction is in an uncommittable state. '' 
      ''Transaction was rolled back''; 
RETURN 
    NEW; 
END' 
LANGUAGE 'plpgsql'; 
+0

トリガーに構文エラーがあります... – joanolo

+0

解決策を見つけましたか? – joanolo

答えて

1

トリガーで実際に何をしたいのかはわかりません(いくつかの説明は援助が必要です)。あなたが書いた方法には、いくつかの構文エラーがあります。

CREATE OR REPLACE FUNCTION update_function() 
RETURNS TRIGGER 
AS 
$$ 
BEGIN 
    BEGIN 
     UPDATE 
      "EVENT" 
     SET 
      rules = (SELECT 
         string_agg(DISTINCT st ->> 'id', ', ') AS rules 
        FROM 
         "JSON_STORAGE" aes, 
         /* This doesn't make much sense to me... */ 
         jsonb_array_elements("EVENT_DATA" -> 'fields' #> '{Tracking}') AS st 
        WHERE 
         (st ->> 'id' LIKE 'rule_%') 
         AND aes."EVENT_ID" = NEW."EVENT_ID" 
        ) 
     WHERE 
      "EVENT"."EVENT_ID" = NEW."EVENT_ID" ; 

     /* Maybe you just want to do this: 
     NEW.rules = (SELECT 
         string_agg(DISTINCT st ->> 'id', ', ') AS rules 
        FROM 
         "JSON_STORAGE" aes, 
         jsonb_array_elements("EVENT_DATA" -> 'fields' #> '{Tracking}') AS st 
        WHERE 
         (st ->> 'id' LIKE 'rule_%') 
         AND aes."EVENT_ID" = NEW."EVENT_ID" 
        ) ; 
     */    

     UPDATE 
      "EVENT" 
     SET 
      longitude /* ip_geo_longitude ?? */ = 
       (CASE 
        WHEN (trim(both '" ' FROM replace(regexp_replace("EVENT_DATA"-> 'fields' -> 'custom_fields' ->> 'device_data', '[\\]{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'device_info_logs' -> 0 ->> 'device_type' = 'Android') THEN 
         trim(both '"' FROM replace(regexp_replace("EVENT_DATA"-> 'fields' -> 'custom_fields' ->> 'inauth_device_data', '[\\]{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'gps_location_logs' -> 0 ->> 'location_wifi_longitude' 
        ELSE 
         trim(both '"' FROM replace(regexp_replace("EVENT_DATA"-> 'fields' -> 'custom_fields' ->> 'inauth_device_data', '[\\]{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'gps_location_logs' -> 0 ->> 'longitude' 
       END), 
      latitude /* ip_geo_latitude ?? */ = 
       (CASE 
        WHEN (trim(both '" ' FROM replace(regexp_replace("EVENT_DATA"-> 'fields' -> 'custom_fields' ->> 'inauth_device_data', '[\\]{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'device_info_logs' -> 0 ->> 'device_type' = 'Android') THEN 
         trim(both '"' FROM replace(regexp_replace("EVENT_DATA"-> 'fields' -> 'custom_fields' ->> 'inauth_device_data', '[\\]{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'gps_location_logs' -> 0 ->> 'location_wifi_latitude' 
        ELSE 
         trim(both '"' FROM replace(regexp_replace("EVENT_DATA"-> 'fields' -> 'custom_fields' ->> 'inauth_device_data', '[\\]{2,}"([^,:])', '\1', 'g'), '\"', '"'))::json -> 'objects' -> 0 -> 'data' -> 'gps_location_logs' -> 0 ->> 'latitude' 
       END) 
     FROM 
      "JSON_STORAGE" aes 
     WHERE 
       "EVENT"."EVENT_ID" = NEW."EVENT_ID" 
      AND "EVENT".ip_geo_longitude IS NULL 
      AND "EVENT".ip_geo_latitude IS NULL 
      AND aes."EVENT_ID" = NEW."EVENT_ID" 
      AND aes."EVENT_DATA"-> 'fields' -> 'custom_fields' ->> 'device_data' LIKE '%{%:%}%' 
      AND aes."EVENT_DATA"->'fields'->>'event_type' = 'transaction_submission' ; 

    EXCEPTION WHEN others THEN 
     RAISE NOTICE 'The transaction is in an uncommittable state. ' 
      'Transaction was rolled back'; 
    END ; 
    RETURN NEW; 
END 
$$ 
LANGUAGE 'plpgsql'; 

このバージョンをコンパイルん:

はたぶんこれはあなたが望むものではありません。それをチェックしてくださいdbfiddle here。それがあなたが望むことをするかどうかは別の話です。

+0

コンパイルされますが、2番目と3番目の更新ステートメントでデータを解析できず、エラーが発生することがあります。そのような場合は、エラーをスローしてエンティティをデータベース上に残さないようにする代わりに、トリガをうまく失敗させたいと思います。 – Anusha

関連する問題