Я пытаюсь обрезать общие записи INSERT / UPDATE для каждой таблицы в БД, чтобы удалить любые пробелы до и после каждого текстового значения (т. Е. Изменить «значение» на «значение»).
Я взялвзгляните на Общий триггер обрезки строк для Postgresql , но это работает только на записях INSERT, поскольку ARGV существует только во время этого события.
Я подумал, что нужно конвертировать NEW в jsonb,что теперь я предполагаю, что имеет вид {"key1": "value1", "key2": "value2"}, но я не знаю, как циклически проходить по его полям, чтобы обрезать его значения.
Iпланирую использовать
SELECT
column_name
FROM
information_schema.columns
WHERE
table_name = TG_TABLE_NAME AND table_schema = TG_TABLE_SCHEMA AND (data_type = 'text' OR data_type = 'character varying' )
, чтобы получить только «ключ1» (столбцы), имеющий строку типа, поэтому сценарий выглядит как
CREATE OR REPLACE FUNCTION a_trigger() RETURNS trigger AS $trim_trigger$
DECLARE
j jsonb = to_jsonb(NEW);
current_column text;
BEGIN
FOR current_column IN
SELECT
column_name
FROM
information_schema.columns
WHERE
table_name = TG_TABLE_NAME AND table_schema = TG_TABLE_SCHEMA AND (data_type = 'text' OR data_type = 'character varying' )
LOOP
IF j ->> current_column IS NOT NULL THEN
j = jsonb_set(j, j ->> current_column, to_jsonb(regexp_replace(j ->> current_column, '^\s*|\s*$', '', 'g')),false);
END IF;
END LOOP;
NEW = jsonb_populate_record(NEW, j);
RETURN NEW;
END;
$trim_trigger$ LANGUAGE plpgsql;
У меня проблемыиспользуя jsonb_set;его подпись "jsonb, text [], jsonb, bool", но j - >> current_column - текст, и, возможно, я не до конца понял параметр 'path'.
Что мне здесь не хватает?
В конце концов я справился с
j = jsonb_set(j, concat('{',current_column,'}')::text[], to_jsonb(regexp_replace(j ->> current_column, '^\s*|\s*$', '', 'g')),false);
(я добавил приведение к тексту [])
Но мне это кажется немного грязным