Программа модификации полей таблицы детали-поставщики

Страницы работы

Содержание работы

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 новой поставки. При этом:

Информация о работе