#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. Я понял то же самое после того, как вы указали мне на это… Спасибо. Да благословит вас Бог