Как циклически пройтись по всем столбцам NEW?

Всем привет! Такой вопрос, каким образом мне сделать, чтобы можно было изменить значение в каждом столбце объекта 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;

Ответы (1 шт):

Автор решения: Akina

Как циклически пройтись по всем столбцам NEW?

Собрать всю запись NEW в один JSON-объект функцией row_to_json().

Затем распарсить полученный JSON на key-value и, зная имя поля и значение, внести необходимые изменения. Например, динамическим SQL.

→ Ссылка