Базы данных SQL-DDL и SQL-DML. Изучение транзакций. Программирование на языке SQL. Консольное приложение (Цикл лабораторных работ). Вариант № 1, страница 19

Уровень изоляции 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

В результате при модификации таблицы отсрочек они (эти модификации) отражаются и в подчинённых таблицах.

  • OLD - имя, представляющее изменяемую строку до изменения ( по умолчанию - old);
  • NEW - имя, представляющее изменяемую строку до изменения ( по умолчанию - new);
  • OLD_TABLE - имя, представляющее изменяемую таблицу до изменения;
  • NEW_TABLE - имя, представляющее изменяемую таблицу до изменения.

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;

Результат её работы представлен ниже: