Уровень изоляции Snapshot table stability не рекомендуется для общих целей. Он должен использоваться только тогда, когда это действительно необходимо, в течение коротких периодов времени. А затем он должен быть подтверждён или откатан, потому что любая другая транзакция, которая пытается писать в ту же таблицу, получит сообщение об ошибке или будет введена в состояние ожидания.
Лабораторная 4. Программирование на языке SQL
4.1. Цели работы
Ознакомление с возможностями реализации более сложной обработки данных на стороне сервера с помощью хранимых процедур и триггеров.
4.2. Программа работы
1) Изучить возможности языка PSQL
2) Создать два триггера: один триггер для автоматического заполнения ключевого поля, второй триггер для контроля целостности данных в подчиненной таблице при удалении/изменении записей в главной таблице
3) Создать хранимую процедуру в соответствии с индивидуальным заданием, полученным у преподавателя
4.3. Выполнение работы
1) Триггер для автоматического заполнения ключевого поля.
Скрипт трггера приведён в листинге 6:
Листинг 6:
as
begin
if (new.id is null) then
new.id = gen_id(gen_address_id,1);
end
В результате при добавлении в таблицу addres он будет генерироваться с уникальным ключевым полем.
2) Триггер для контроля целостности данных в подчиненной таблице при изменении записей в главной таблице.
Скрипт триггера приведён в листинге 7:
Листинг 7:
AS
begin
delete from delays
where delays.person_id = OLD.id ;
end
В результате при модификации таблицы отсрочек они (эти модификации) отражаются и в подчинённых таблицах.
3) Хранимая процедура в соответствии с индивидуальным заданием - процедура, которая ищет необследованных на заданную дату людей и создаёт повестки (в случае отсутствия у них отсрочек). Результат выполнения
Скрипт процедуры приведён в листинге 8:
Листинг 8:
create or alter procedure CREATE_SUMMONS (
DT timestamp)
as
declare variable PERSON_ID integer;
begin
for select p.id /для айди призывника
from people p, status_history sh /из таблиц призывников и истории статусов
where sh.person_id=p.id and sh.dt_change<=:dt /где история статусов соответствует призынику и дата изменения статуса <= указанной дате
and sh.status_id=0 / соответствующий статусу не обследован
and not exists(select 1 from status_history sh2 where sh2.person_id=sh.person_id and sh2.dt_change>sh.dt_change and sh2.dt_change<=:dt) / и не извлекать первого попавшегося со статусом 0,если у него изменился с тех пор статус до заданной даты
and not exists(select 1 from summons s where s.dt_create<=:dt and s.dt_create>(:dt-7)) / и не извлекать первого из таблицы повесток, дата создания которой <= задаваемой даты и > даты повестки
and not exists(select 1 from delays d where d.person_id=:person_id and d.dt_to>=:dt) / и не извлекать первого из таблицы где дата отсрочки >= задаваемой даты
into :person_id
do
begin
insert into summons(dt_create, dt_summon, person_id) values(:dt, :dt+7, :person_id);
end
end;
Результат её работы представлен ниже:
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.