1)Отслеживается модификация в таблице р поля номер детали. Если в таблице Р номер измененной детали совпадает хотя бы с одним существующим номером детали, то модификация отменяется, в противном случае производится каскадная модификация поля номер детали в spj.
Create trigger test
update on p referencing old as prev
new as next
for each row
executeprocedure A(prev.n_det,next.n_det)
create procedure A(p,n)
define char p,n,s
select n_det into s from p x,p y
where x.n_det=y.n_det and x.rowid!=y.rowid
if s==null
update spj
set n_det = n
where n_det = p
else
update p
set n_det=p
where n_det = n
endif
end procedure
2) №9. Отслеживать обновления поля n_post таблицы S. Обеспечить его уникальность:
- если обновленное значение нарушает уникальность – модификация игнорируется
- если не нарушает, то продолжается каскадное обновление таблицы spj
(zHOPA)
create trigger nomer_upd
update of n_post on s
referencing new as new1
old as old1
for each row
begin
declare c smallint;
select count(*) into c from s
where s.n_post=new1.n_post
if c>1
update s set n_post=old1.n_post
where s.rowid=new1.rowid
else
update spj set n_post = new1.n_post
where spj.n_post = old1.n_post
endif
end
3) №12. При удалении поставки, если объем поставок поставщика уменьшается на 90%, то рейтинг уменьшается на 10%.
Create trigger tr delete on spj
Referencing old as A
Execute procedure ppp(A.n_post,A.kol)
Create procedure ppp(npost char(6),kolvo int)
define s1 int;
Let s1 = (select sum(kol) from spj where n_post = npost);
If kolvo>s1 then
Update s Set reiting = 0.9*reiting WHERE
N_post = npost;
Endif
End procedure
4) №7. Отслеживается удаление строк из таблицы деталей р. Если удаляемая деталь присутствует в таблице поставок spj, то соответствующие строки из таблицы поставок связываются с деталью с минимальным весом из того же города, в противном случае деталь удаляется.
Create trigger del_on_p
Delete on p
Referencing old as old_st
For each row
(execute procedure u (old_st.n_det,old_st.town))
Create procedure u (n_d char(6), gor char(15))
Define flag, flag1 int;
Define det1 char(6);
Let flag = 0; let flag1=0;
If(select count(*) from p where p.town=gor)<=1
Then delete from spj where p_n_det=n_d
Else let flag1=1
Endif;
If(flag1=1) then update spj
Set n_det=(select n_det from p x where x.ves=(select min(ves) from p where town=gor)
Where n_det=n_d endif
End procedure
/******************************/
Запрос!
Create table ppp(n_d char(6), name char(20), cvet char(7),
ves smallint,town char(15));
select n_d from ppp x where x.rowid=(select min(rowid) from ppp where n_d in(select n_d from ppp where town=’Лондон’ and ves = (select min(ves) from ppp)))
drop(ppp);
/***********************************/
Ответ; Выбрать номер первой детали в таблице, если она из Лондона и ее вес минимальный.
/***********************************/
5) №1. Вводится новая поставка. Если не было поставки, то ищем минимальный рейтинг => если рейтинг=50%. Если этот номер поставки для детали для суд(?) , смотрим, если таких деталей нет, то поставка не добавляется.
????????????????????????????????????////
Create trigger ON_INSERT_SPJ
insert on spj
Referencing new as _ins for each row
Execute procedure _insert
(_ins.n_det, _ins. _n_post, _ins._n_izd, _ins._kol)
Create procedure _insert(_ndet,_n_post,_n_izd,_kol)
Define reiting integer;
If ((select n_post from s where n_post=_n_post) is NULL)
Then
Let reiting=0.5*(select min(reiting) from s);
Insert into s(n_post,reiting) values (_n_post,_reiting);
Endif
If((select n_det from p where n_det=_n_det) is NULL or (select n_izd
from j where n_izd=_n_izd) is NULL)
then
delete from spj
where n_det=_n_det and n_psot=_n_post and n_izd=_n_izd
and kol=_kol
delete from S where n_post = n_post
endif
end procedure
6) №3. Отслеживается удаление поставок из таблицы поставок spj. В случае, если удаляемая поставка уменьшает суммарный объем поставок некоторого поставщика более, чем на 50%, рейтинг поставщика в таблице S уменьшается на 10%
create trigger test1
delete on spj referencing old as original
for each row execute procedure reit(original.kol,original.n_post)
create procedure reit(k,n)
define k int; define n char(6);
if(select sum(kol) from spj)<k*0.5 update s set reiting = 0.9*reiting where n_post = n;
endif
end procedure
7) №5. Активизируется при вставке в spj новой поставки. При этом:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.