В какой момент определяется тип 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;