Руководство по программному пакету ERwin

         

Пример триггера Entity Override


Ниже приводится исходный код шаблона для создания триггера Entity Override Child-Insert для сущности ORDER-LINE. Новый код, используемый для добавления order-quantity к prooduct-sold-quantity, вставляется сразу же после выражения %ForEachChildRel, поскольку сущность ORDER-LINE является дочерней в связи между ORDER-LINE и PRODUCT. Вставляемый код приводится ниже.

сreate trigger %TriggerName on %TableName
for %Actions(',')
as
/* %Actions(',') trigger on %TableName */
/* default body for %TriggerName */
begin
declare @numrows int,
@nullcnt int,
@validcnt int,
%PKDecl(,@ins),
@errno int,
@errmsg varchar(255)
select @numrows = @@rowcount
%ForEachChildRel(){
%RelTemplate
}
%ForEachParentRel(){
%RelTemplate
}
return
error:
raiserror @errno @errmsg
rollback transaction
end
go

Рис. 16.15.

Код измененного шаблона, включающий в себя специальный код (он выделен), нужный для того, чтобы изменять значение product-sold-quantity в таблице PRODUCT каждый раз при добавлении новой строки в таблицу ORDER LINE, показан ниже. Для того чтобы просмотреть расширенный код после того, как шаблон, заданный по умолчанию, изменен, щелкните по окну Expanded Code.

сreate trigger %TriggerName on %TableName
for %Actions(',')
as
/* %Actions(',') trigger on %TableName */
/* default body for %TriggerName */
begin
declare @numrows int,
@nullcnt int,
@validcnt int,
%PKDecl(,@ins),
@errno int,
@errmsg varchar(255)
select @numrows = @@rowcount
%ForEachChildRel(){
%RelTemplate
%if (%==(%VerbPhrase,is requested on)){
update %Parent from %Parent,inserted
set product-sold-quantity = %Parent.product-sold-quantity
+inserted.order-quantity
where
%JoinFKPK(inserted,%Parent)
}
}
%ForEachParentRel(){
%RelTemplate
}
return
error:
raiserror @errno @errmsg
rollback transaction
end
go

Рис. 16.16

Далее приводится расширенный код триггера, где Вы можете увидеть реальные значения, которые заменили макропеременные, использованные в коде шаблона. Обратите внимание, что специальный код, изменяющий таблицу PRODUCT, дублируется в каждом триггере Child-Insert, связанном с сущностью ORDER-LINE.


create trigger special order-line insert on
ORDER_LINE
for INSERT
as
/* INSERT trigger on ORDER_LINE */
/* default body for special order-line insert */
begin
declare @numrows int,
@nullcnt int,
@validcnt int,
@ins_order_line_number CHAR(18),
@ins_order_id CHAR(18),
@errno int,
@errmsg varchar(255)
select @numrows = @@rowcount
/* ERwin Builtin Fri Apr 02 09:42:42 1993 */
/*ORDER contains ORDER_LINE ON CHILD INSERT RESTRICT */
if
/*%ChildFK('or',update) */
update(order_id)
begin
select @nullcnt = 0
select @validcnt = count(*)
from inserted,ORDER
where
/*JoinFKPK(inserted,ORDER) */
inserted.order_id = ORDER.order_id
/*NotnullFK(inserted,'is null','select @nullcnt =
count(*) from inserted where',' or') */
if @validcnt + @nullcnt != @numrows
begin
select @errno = 30002,
@errmsg = 'Cannot INSERT 'ORDER_LINE'
because 'ORDER' does not exist'.
goto error
end
end
/* ERwin Builtin Fri Apr 02 09:42:42 1993 */
/*PRODUCT is requested on ORDER_LINE ON CHILD INSERT RESTRICT */
if
/* %ChildFK('or',update) */
update(product_model_number)
begin
select @nullcnt = 0
select @validcnt = count(*)
from inserted,PRODUCT
where
/*%JoinFKPK(inserted,PRODUCT) */
inserted.product_model_number =
PRODUCT.product_model_number
/*%NotnullFK(inserted,'is null',select @nullcnt =
count(*) from inserted where',' or') */
select @nullcnt = count(*) from inserted where
inserted.product_model_number is null
if @validcnt + @nullcnt != @numrows
begin
select @errno = 30002,
@errmsg = 'Cannot INSERT 'ORDER_LINE'
because 'PRODUCT' does not exist'.
goto error
end
end
update PRODUCT from PRODUCT,inserted
set product-sold-quantity=PRODUCT.product-sold-quantity
+ inserted.order-quantity
where
inserted.product_model_number=
PRODUCT.product_model_number
return
error:
raiserror @errno @errmsg
rollback transaction
end
go
Рис. 16.17. Расширенный код триггера для
'special ORDER_LINE INSERT'.

Содержание раздела