Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Проверить целостность объекта до коммита  [new]
the_moon
Member

Откуда: Германия
Сообщений: 332
Привет,

вот записывается в базу некий объект, несколькими инсертами. Как проверить его целостность до коммита или при коммите? Что то вроде trigger on commit интересует.

К примеру, есть база в которой в обобщенной форме хранятся описания агрегатов и их деталей из машиностроения. Там все описанно, от мотора, до гаечек и шайбочек. Причем каждый агрегат и деталь имеют свои свойства. К примеру у гайки свойства, это толщина, материал, направление резьбы и внутренний диаметр. У болта - резьба, длинна, диаметр. У кабеля, это диаметр, тип изоляции, диаметр, цвет.

Что бы облегчить процесс ввода новых деталей, придумали шаблоны. Гайка, Болт, Кабель и так далее, с обязательными и необязательными свойствами. Тоесть когда инженер добавляет в базу новую гайку, он выбирает шаблон Гайка и на основе шаблона аппликация создает форму с уже добавленными свойствами, для которых надо только ввести значения или выбрать значения из списка.

Все хорошо, все работает. Но иногда меняют аппликацию, или просто накосячили в аппликации, или импортировали данные из другой базы и получаются косяки. Типа У гайки отсутсвует свойство Диаметр, которое является обязательным у использованного для создания шаблона.

Тоесть хотелось бы как то проверить, если аппликация создает новый объект в базе по шаблону, то надо выполнить некий триггер, который просто проверит, все ли обязательные аттрибуты присутсвуют у объекта перед коммитом.

может есть паттерн для этого какой, необязательно триггер.
23 июл 09, 13:37    [7450831]     Ответить | Цитировать Сообщить модератору
 Re: Проверить целостность объекта до коммита  [new]
Elic
Member

Откуда:
Сообщений: 29980
Один объект - это должна быть какая-то ровно одна "главная" строка. Там добавляешь признак inserting/inserted и при переходе в inserted триггером можно выполнить необходимую валидацию.
23 июл 09, 13:52    [7450972]     Ответить | Цитировать Сообщить модератору
 Re: Проверить целостность объекта до коммита  [new]
the_moon
Member

Откуда: Германия
Сообщений: 332
Elic
Один объект - это должна быть какая-то ровно одна "главная" строка. Там добавляешь признак inserting/inserted и при переходе в inserted триггером можно выполнить необходимую валидацию.


Но ведь получается тут как с курицей и яйком.

Что бы добавить в табличку со свойствами записи, мне надо уже иметь "головную" запись в другой табличке. И когда должен сработать триггер?
23 июл 09, 13:57    [7451017]     Ответить | Цитировать Сообщить модератору
 Re: Проверить целостность объекта до коммита  [new]
the_moon
Member

Откуда: Германия
Сообщений: 332
Elic
Один объект - это должна быть какая-то ровно одна "главная" строка. Там добавляешь признак inserting/inserted и при переходе в inserted триггером можно выполнить необходимую валидацию.


А, понял, что ты имеешь в виду, но так получается гемморойно для аппликации. И что если она сразу статус выставит "inserted"?
23 июл 09, 14:00    [7451049]     Ответить | Цитировать Сообщить модератору
 Re: Проверить целостность объекта до коммита  [new]
oragraf
Member

Откуда: Moscow
Сообщений: 1314
the_moon
Elic
Один объект - это должна быть какая-то ровно одна "главная" строка. Там добавляешь признак inserting/inserted и при переходе в inserted триггером можно выполнить необходимую валидацию.


Но ведь получается тут как с курицей и яйком.

Что бы добавить в табличку со свойствами записи, мне надо уже иметь "головную" запись в другой табличке. И когда должен сработать триггер?
Elic и написал, что фиксация объекта должна быть как бы двухфазовой inserting/inserted - inserting - вставка записи в главную талицу объектов и в таблицы атрибутов, перещелкивание в inserted - срабатывание триггера и валидация. Вообще, тут столько вариантов видится, просто надо подумать и спроектировать
23 июл 09, 14:00    [7451051]     Ответить | Цитировать Сообщить модератору
 Re: Проверить целостность объекта до коммита  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
the_moon
Elic
Один объект - это должна быть какая-то ровно одна "главная" строка. Там добавляешь признак inserting/inserted и при переходе в inserted триггером можно выполнить необходимую валидацию.

А, понял, что ты имеешь в виду, но так получается гемморойно для аппликации. И что если она сразу статус выставит "inserted"?

create or replace trigger tr_tr_tr
  before update on the_main_table
  for each row
begin
  if     not (:new.transaction_state = 'inserted' and :old.transaction_state = 'inserting')
     and not (:old.transaction_state = 'inserted' and :new.transaction_state = 'inserting') then
    raise_application_error(-20001, 'Это хито туть балуецца?');
  end if;
end tr_tr_tr;
23 июл 09, 14:55    [7451469]     Ответить | Цитировать Сообщить модератору
 Re: Проверить целостность объекта до коммита  [new]
suPPLer
Member

Откуда: Харків, Україна
Сообщений: 7794
Блог
Ну и, соответственно:

create or replace trigger tr_tr_tr
  before insert on the_main_table
  for each row
begin
  :new.transaction_state := 'inserting';
end tr_tr_tr;
-------------------------------------------------------
When I say "RTFM" or "STFF" or "STFW",
the third letter means "Following" or "Fine"...
23 июл 09, 14:57    [7451485]     Ответить | Цитировать Сообщить модератору
 Re: Проверить целостность объекта до коммита  [new]
hoarfrost
Member

Откуда: Волгоград
Сообщений: 438
Если же правила можно выразить при помощи CONSTRAINT-ов, то, быть может, стоит воспользоваться ограничениями, проверяемыми при COMMIT-е?
23 июл 09, 16:31    [7452421]     Ответить | Цитировать Сообщить модератору
 Re: Проверить целостность объекта до коммита  [new]
the_moon
Member

Откуда: Германия
Сообщений: 332
hoarfrost
Если же правила можно выразить при помощи CONSTRAINT-ов, то, быть может, стоит воспользоваться ограничениями, проверяемыми при COMMIT-е?


думал уже, но тут не получается. Правила же, какое свойство обязательно, какое нет задаются пользователем, а не во время дизайна. Предложенное решение с триггерами конечно возможно, но сложно. Придется переделывать аппликацию.
24 июл 09, 01:07    [7454075]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить