каким образом мне сделать, чтобы можно было изменить значение в каждом столбце объекта NEW, но чтобы это не приходилось хардкодить? Вариант использования UPDATE не подойдет, так как этот код будет использоваться в триггере на update
FOREACH v_column IN ARRAY v_columns LOOP
IF EXISTS (
SELECT 1
FROM information_schema.columns
WHERE table_name = TG_TABLE_NAME AND column_name = v_column
) THEN
EXECUTE format('SELECT ($1).%I', v_column) INTO v_value USING NEW;--получаем значение незашифровонное
IF v_value IS NOT NULL THEN --если оно не NULL
--NEW.email := text(pgp_sym_encrypt(v_value, 'Aboba')); можно конечно вот так, но тогда придется каждый столбец писать харкодом
EXECUTE format('$1.%I := $2', v_column) USING NEW, text(pgp_sym_encrypt(v_value, 'Aboba')); -- шифруем, здесь я пытался заменять значение NEW через execute чтобы столбцы заменялись динамически
END IF;
ELSE
RAISE EXCEPTION 'Column "%" not found in table %', v_column, TG_TABLE_NAME;
END IF;
END LOOP;