Подскажите по Object Type

borka1985
Дата: 03.12.2009 18:34:31
Есть некий объектный тип. Экземпляры этого типа хранятся в поле реляционной таблицы. Хотелось бы создать триггер на изменение конкретного атрибута объектного типа. Наподобие событийной модели таблиц.

Можно создать View и через Instead OF. Но это не выход из ситуации. Так же можно добраться до системной таблицы где будет хранится значение атрибута и на неё навесить триггер.

Может кто подскажет как проще реализовать данное действие?
4ton
Дата: 03.12.2009 18:53:49
borka1985,

а чем не нравятся предложенные вами способы? Других-то вариантов, наверно, нет
borka1985
Дата: 03.12.2009 19:24:35
В принципе способы нормальные, но в создании View и INSTEAD OF мне не нравится, что условно придется сравнивать все значения старого и нового экземпляра и определять нужный атрибут меняет значение или нет.
Для большей ясности: на основе базового типа создаются производные объекты. Соответственно необходим универсальный обработчик событий. Т.е. помимо атрибутов и методов в объектном типе создаются свойства и события. Наподобие:

create or replace TYPE TObject as object
(
FDummy char(1),
Guid RAW(16),

-- Внимание на эти элементы-------
ObjectName TProperty,
ChangeObjectName TEvent,
-------------------------------------

member FUNCTION GetType RETURN anytype,
member FUNCTION GetTypeName RETURN VARCHAR2,
member FUNCTION Equals RETURN BOOLEAN,
member FUNCTION GetSuperTypeName RETURN varchar2
member FUNCTION ToString RETURN varchar2
)

Ещё один вариант запретить изменение атрибутов напрямую, оставить только так называемые свойства внутри которых описать методы типа GetObjectName и SetObjectName. Внутри уже этих методов вызывать что-то наподобие ChangeObjectName.CallMethods.

Что думаете насчет такой схемы? Жаль что перегрузку операторов на PL/SQL нельзя делать((
andrey_anonymous
Дата: 03.12.2009 19:32:35
borka1985
Жаль что перегрузку операторов на PL/SQL нельзя делать((

А можно с этого места поподробнее (мало ли что Вы оператором называете) :)
borka1985
Дата: 03.12.2009 19:39:17
Под оператором я понимаю ограничители, скажем перегрузить ограничитель присваивания :=. В качестве примера ObjectName:='объект1', вызывалась бы функция SetObjectName('объект1').