ТРИГГЕРНОЙ ФУНКЦИИ POSTGRES не удается сформировать ПОЛЕЗНУЮ НАГРУЗКУ JSON

#postgresql #function #triggers #insert

#postgresql #функция #триггеры #вставить

Вопрос:

У меня есть таблица в postgresql, в которой необходимо сохранить функцию и триггер, который уведомит мой сервер и отправит таблицу столбцов и значения в виде полезной нагрузки json, однако в функции строки ниже выполняются и создают функцию

— Получить обязательные поля

   CREATE FUNCTION api.alarm_siren() RETURNS trigger AS $trigger$
DECLARE
 rec RECORD;

 payload TEXT;
 column_name TEXT =  ARRAY['column_name'];
 column_value TEXT;
 payload_items JSONB;
BEGIN
 -- Set record row depending on operation
 CASE TG_OP
 WHEN 'INSERT', 'UPDATE' THEN
    rec := NEW;
 WHEN 'DELETE' THEN
    rec := OLD;
 ELSE
    RAISE EXCEPTION 'Unknown TG_OP: "%". Should not occur!', TG_OP;
 END CASE;
 
 -- Get required fields
 FOREACH  column_name IN ARRAY TG_ARGV LOOP
   EXECUTE format('SELECT $1.%I::TEXT', column_name)
   INTO column_value
   USING rec;
   payload_items := coalesce(payload_items,'{}')::jsonb || json_build_object(column_name,column_value)::jsonb;
 END LOOP;

 -- Build the payload
 payload := json_build_object(
   'timestamp',CURRENT_TIMESTAMP,
   'operation',TG_OP,
   'schema',TG_TABLE_SCHEMA,
   'table',TG_TABLE_NAME,
   'data',payload_items
 );

 -- Notify the channel
 PERFORM pg_notify('notify_alarm_siren', payload);
 
 RETURN rec;
END;
$trigger$ LANGUAGE plpgsql;

create trigger beep_alarm_siren after
insert
or
delete
or
update
on
api.mpesa_c2b_txn for each row execute procedure api.alarm_siren();

 

Однако попытки вставить данные в базу данных тщетны и приводят к ошибке, приведенной ниже

 CONTEXT:  PL/pgSQL function api.alarm_siren() line 20 at FOREACH over array
SQL state: 22004```



  
 

Комментарии:

1. Уверен, что это должно быть TG_ARGV[] для каждого триггера plpgsql. Это также помогло бы увидеть, как вы определили триггер в таблице. Добавить в качестве обновления к вопросу.

2. Я не вижу никаких аргументов, переданных функции в сообщении об ошибке. Добавить в качестве обновления к вопросу. Также остальная часть функции была бы приятной.

3. я отредактировал свой вопрос со всей функцией и триггером @Adrian Klaver

4. TG_ARGV[] например, для аргументов, переданных в функцию в триггере api.alarm_siren(arg1, arg2) . Вы не передаете никаких аргументов, поэтому нет ничего, что нужно перебирать. Вам нужно потратить некоторое время на запуск plpgsql.

5. Я понял то же самое после того, как вы указали мне на это… Спасибо. Да благословит вас Бог