Автологирование некоторых действий.

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Автологирование некоторых действий.

Сообщение Kotъ-Begemotъ » 04 мар 2008, 14:47

Задача, скажем, отслеживать состояние водителя в таблице водителей. То есть при выходе на работу записывать в специальную таблицу-лог его ID и время начала работы. И при завершении работы апдейтить эту запись, дописывая время ухода.
Есть мысль попытаться это автоматизировать таким образом:

Таблица водителей, ну пусть такая:

Код: Выделить всё

CREATE TABLE DRIVER(
    DRIVERID INTEGER NOT NULL,
    STATEID SMALLINT, /* ID состояния 0-не работает любое другое-работает */
     WORKID INTEGER /* ID записи в логе */
);
Таблица-лог:

Код: Выделить всё

CREATE TABLE DRVLOG(
    WORKID INTEGER NOT NULL,
    DRIVERID INTEGER,
    INTIME TIMESTAMP, /* Время выхода на работу */
    OUTTIME TIMESTAMP /* Время ухода с работы */
);
1. В триггере на BEFORE UPDATE для DRIVER сделать:

Код: Выделить всё

  IF (OLD.STATEID=0 AND NEW.STATEID<>0) THEN
    NEW.WORKID = GEN_ID(GEN_DRVWRK, 1);
2. В триггере на AFTER UPDATE для DRIVER:

Код: Выделить всё

BEGIN
  IF (OLD.STATEID=0 AND NEW.STATEID<>0) THEN
   BEGIN
    /* Вызываем процедуру создания записи в логе с ID юзера и WorkID */
     EXECUTE PROC(OLD.DRIVERID, NEW.WORKID, 1);
   END
   ELSE
    BEGIN
     /* Вызываем процедуру дописывания в лог времени выхода */
      EXECUTE PROC(OLD.USERID, OLD.WORKID, 0);
    END
END
Ну, с процедурой всё понятно, её рассматривать нет смысла...

Вопрос - как считаете такой механизм достаточно жизнеспособен, ли я чего-то не учёл? Вроде после изменения в BU значения WORKID оно должно быть доступно в AU именно в изменённом значении?

Kotъ-Begemotъ
Сообщения: 250
Зарегистрирован: 25 июл 2007, 21:33

Сообщение Kotъ-Begemotъ » 04 мар 2008, 21:45

Ну, вроде пока работает :) Я уж как только не извращался, пытался смоделировать ситуацию когда не сработает - пока не получилось. Оставлю. Уж больно хорошо - голова не болит откуда как когда записывать в лог. Пишется себе само-собой :)))
Ессно пример не точно такой как я привёл - тут ляпы есть, доработал напильником :))) В общем спасибо за дружеское молчание. Не обругали и то ладно :)))

Ответить