
Лабораторные работы (А-13-07) / Михайлова, Панков / Л9
.doc
Лабораторная работа №9
Студенты:
Михайлова В.А.
Панков Д.Е.
Группа: А-13-07
Преподаватель: Сидорова Н.П.
1. Создать триггер на проверку правильности ввода значений в одно из полей вашей информационной таблицы: «Год приема» (значения от ‘00’ до ‘99’), «Год окончания» (значения от ‘00’ до ‘99’), «Код категории обучения» (значения от ’01’ до ‘17’), «Код семейного положения» (значения от ‘0’ до ‘3’); значения этих полей должны быть заданы в отдельной таблице вашей БД;
create trigger proverka1 on poss2
for insert as
declare @gp char(2)
declare @gok char(2)
declare curs cursor for
select gp,gok from inserted
open curs
fetch curs into @gp,@gok
if (not (@gp between '00'and '99'))
select 'Значение поля "Год приема" неверно'
if (not (@gok between '00'and '99'))
select 'Значение поля "Год окончания" неверно'
if (select count(*) from family,inserted
where family.cod=inserted.sem_polog_k)=0
select 'Значение поля "Семейное положение" неверно'
if (select count(*) from kat_obuch,inserted
where kat_obuch.cod=inserted.kat_obuch_k)=0
select 'Значение поля "Категория обучения" неверно'
close curs
deallocate curs
Пример корректного ввода
insert poss2 values
(534421,'Козырев Юрий Иванович ','18','12','71','M',
'0','001702','05',0419569,'09','89','03','93')
Примеры некорректных вводов
insert poss2 values
(534421,'Козырев Юрий Иванович ','18','12','71','M',
'0','001702','05',0419569,'09','--','03','93')
Значение поля Год приема неверно
insert poss2 values
(534421,'Козырев Юрий Иванович ','18','12','71','M',
'0','001702','05',0419569,'09','89','03','%4')
Значение поля Год окончания неверно
insert poss2 values
(534421,'Козырев Юрий Иванович ','18','12','71','M',
'9','001702','05',0419569,'09','89','03','%4')
Значение поля Семейное положение неверно
insert poss2 values
(534421,'Козырев Юрий Иванович ','18','12','71','M',
'9','001702','18',0419569,'09','89','03','%4')
Значение поля Категория обучения неверно
2. Создать 3 отдельных триггера (для операторов INSERT, UPDATE и DELETE) для автоматического внесения изменений в таблицу VUZ (поля «Код вуза» и «Название вуза»), если вносятся такие же изменения в таблицу VUZ_GOROD.
Триггер для оператора INSERT
create trigger vuzins on vuz
for insert as
insert into vuz_gorod
(cod_vuza,nazvanie_vuza)
select inserted.cod,inserted.uch_zavedenie from inserted
Пример
insert vuz values
(123456,'Ин-т Екатерины Великой')
Триггер для оператора UPDATE
create trigger vuzupd on vuz
for update as
declare @cod1 integer
declare @uch_zav1 char(25)
declare @cod2 integer
declare @uch_zav2 char(25)
declare cur1 cursor for select cod, uch_zavedenie from inserted
open cur1
fetch cur1 into @cod1,@uch_zav1
close cur1
declare cur2 cursor for select cod, uch_zavedenie from deleted
open cur2
fetch cur2 into @cod2,@uch_zav2
close cur2
if not(@cod1=@cod2)
update vuz_gorod
set cod_vuza=@cod1
where cod_vuza=@cod2
if not(@uch_zav1=@uch_zav2)
update vuz_gorod
set nazvanie_vuza=@uch_zav1
where nazvanie_vuza=@uch_zav2
deallocate cur1
deallocate cur2
Пример
update vuz
set cod=654123
where cod=123456
Триггер для оператора DELETE
create trigger vuzdel on vuz
for delete as
declare @cod integer
declare @uch_zav char(25)
declare cur cursor for select cod,uch_zavedenie from deleted
open cur
fetch cur into @cod,@uch_zav
close cur
delete from vuz_gorod
where cod_vuza=@cod
Пример
delete from vuz
where cod=654321
3. Собственный триггер.
При удалении записей из таблицы GOROD, автоматически становятся неопределенным поля Код города и Название города и таблицы VUZ_GOROD
create trigger ourtrig on gorod
for delete as
declare @cod char(3)
declare @name char(20)
declare cursd cursor for select cod,nazvanie_goroda from deleted
open cursd
fetch cursd into @cod,@name
close cursd
update vuz_gorod
set cod_goroda=null
where cod_goroda=@cod
update vuz_gorod
set nazvanie_goroda=null
where nazvanie_goroda=@name
delete from gorod
where cod='251'