Задать вопрос
@Stalk007

Как циклически пройтись по всем столбцам 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;
  • Вопрос задан
  • 69 просмотров
Подписаться 1 Простой 3 комментария
Решения вопроса 1
@Akina
Сетевой и системный админ, SQL-программист.
А не надо ничего хардкодить. И в INFORMATION_SCHEMA лезть тоже необязательно. Берём да используем row_to_json(NEW), и вся структура как на ладошке.

Пример

Получить массив/роусет ключей/значений и пробежаться по нему в цикле - уже не проблема.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы