когда вставляет определение в jsonb, если есть строковые значения с \ u0000 и как использовать триггеры для замены строкового сегмента на «нулевой» или пустой - PullRequest
0 голосов
/ 06 января 2020

В какой момент определяется тип json / jsonb? Я пытаюсь определить JSONB, но планирую вставить, где может быть неверный ввод. Я пытаюсь учесть это на вышеупомянутом бизнес-уровне, но я думаю, что БД должен обрабатывать этот подъем с помощью триггеров и процедур.

Правила для jsonb - это то, что строки в json не могут содержать \u0000 и я сказал себе: может быть, есть триггер, который я могу использовать перед вставкой, чтобы заменить все строки, но я не был уверен, как работает psql в этом отношении. Поскольку столбец таблицы - это jsonb, произойдет ли ошибка до срабатывания триггера, или этот перехват может быть использован для правильной очистки всех строковых значений.

Пока я собирался очистить это на бизнес-уровне выше, я подумал что, возможно, БД должна иметь возможность обрабатывать такого рода проблемы вместо ошибок, она должна быть в состоянии обрабатывать на основе моего варианта использования.

Для приведенного ниже примера у меня есть таблица с именем:

CREATE TABLE DEVICE (
  device_data jsonb not null
)

Вот исходная мысль, с которой я работал.

CREATE OR REPLACE FUNCTION jsonb_update_strings()
RETURN TRIGGER as $$
BEGIN
  -- do string sanitization here for all STRINGS in object. Recursively (to account for arrays and sub-objects)
END;
$$ language plpgsql;

CREATE OR REPLACE TRIGGER sanitize_jsonb_object
BEFORE INSERT on public.device
FOR EACH ROW
EXECUTE PROCEDURE public.jsonb_update_strings()
-- Execute other procedures with regard to other types tbd.

Я пытаюсь учесть случаи использования в https://www.postgresql.org/docs/9.4/datatype-json.html, в которых я соответственно заменяю строки.

Я уверен, что это было сделано, но я не уверен, как.

Редактировать 1 Я смотрел на функцию ЗАМЕНА, которая следует за этим потоком: REPLACE ('ABC AA', 'A', 'Z'); и будет вернуть ZBC ZZ, поэтому я подумал применить его выше в процедуре.

BEGIN
   NEW.device_data = REPLACE(NEW.device_data, "\u0000", "null")
END;
...