Oracle. Row-level trigger. Пример

max аватар
110

Рассмотрим следующую ситуацию в данном примере. 

Допустим, в нашей программе есть определенные таски, которые выполняются и имеют набор статусов. Например, STARTING, STARTED, WAITING, RUNNING, FINISHED. 

Есть таблица RUN_JOBS, в которой одна запись соответствует одному таску. Когда же таск меняет статус, эта запись обновляет свой статус, а также проставляет таймстемпы в момент перехода в определенный статус и в момент его окончания. 

Мы же хотим логгировать все переходы из одного статуса в другой и время, которое понадобилось на смену статусов в другую таблицу. 

И так, таблица RUN_JOBS:

Для логгирования создадим таблицу:

FROM_STATUS будет содержать значение статуса, из которого таск вышел, TO_STATUS - новый статус. TIME_ELAPSED - сюда будем записывать время,  которое было затрачено таском в определенном статусе. 

 

Сделаем foreign key в таблице RUN_JOBS_LOG для связи с таблице тасков  - RUN_JOBS. 

 

Для вычисления времени в секундах между двумя timestamp будем использовать функцию из этого поста - Oracle PL/SQL. Как вычислить разницу в секундах между двумя timestamp?

 

А для записи изменения всех статусов будем использовать row-level триггер на таблице RUN_JOBS. Он будет отслеживать изменения значений в колонке STATUS, вычислять затраченное время и записывать в таблицу RUN_JOBS_LOG.

В триггере используется sequence для получения инкремента для id. 

Создаем его:

 

И так, триггер возбуждается при изменении значений в колонке STATUS. 

:new дает нам возможность доступаться к новым измененным значениям. 

:old  позволяет получить старые значения. 

То есть,

если статус изменился со STARTING в STARTED,

то :old.status будет содержать значение STARTING, а 

:new.status - STARTED.

 

Спасибо за внимание. 


Конец
Джеймс Рассел Лоуелл в свое время заметил, что полезно время от времени ставить знак вопроса на вещах, которые тебе давно представляются несомненными.

Отличное рабочее место + довольно интересно оформлена фотка

Статья очень понравилась

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке