Ограничьте столбец JSON конкретными объектами с помощью проверки ограничений - PullRequest
0 голосов
/ 19 сентября 2019

Мы используем Oracle 12.2 и имеем следующую структуру таблицы:

create table myData
(
    id number,
    json_data varchar2(4000),
    CONSTRAINT checkJson    CHECK (json_data IS JSON STRICT WITH UNIQUE KEYS),
    CONSTRAINT checkJson_F1 CHECK (json_exists(json_data, '$.FIELD1')),
    CONSTRAINT checkJson_F2 CHECK (json_exists(json_data, '$.FIELD2'))
);

Мы используем ограничения (checkJson_F1, checkJson_F2), чтобы гарантировать, что вставки / обновления возможны только при наличии FIELD1 и FIELD2:

insert into myData(id, json_data) values(1, '{"FIELD1" : "abc", "FIELD2" : "def"}'); -- OK
insert into myData(id, json_data) values(2, '{"FIELD1" : "abc"}'); -- Error

Есть ли способ проверить наличие несуществующих объектов, например, я хочу ограничить, чтобы следующая вставка генерировала ошибку:

insert into myData(id, json_data) values(1, '{"FIELD1" : "abc", "FIELD2" : "def", "FIELD3" : "def"}');

Другими словами: я хочу проверить ограничениегде я могу ограничить объекты, которые могут храниться в JSON-столбце.Мой псевдокод будет выглядеть так:

CONSTRAINT checkJson_FX CHECK (json_getObjects(json_data, '$.*') in ("FIELD1", "FIELD2"))

1 Ответ

1 голос
/ 19 сентября 2019
create table myData (
  id number,
  json_data varchar2(4000),
  CONSTRAINT checkJson    CHECK (json_data IS JSON STRICT WITH UNIQUE KEYS),
  CONSTRAINT checkJson_F1 CHECK (
    json_exists(json_data, '$?(@.size() == 2 && exists(@.FIELD1) && exists(@.FIELD2))')
  )
);

С уважением, Stew Ashton

...