Автологирование некоторых действий.
Добавлено: 04 мар 2008, 14:47
Задача, скажем, отслеживать состояние водителя в таблице водителей. То есть при выходе на работу записывать в специальную таблицу-лог его ID и время начала работы. И при завершении работы апдейтить эту запись, дописывая время ухода.
Есть мысль попытаться это автоматизировать таким образом:
Таблица водителей, ну пусть такая:
Таблица-лог:
1. В триггере на BEFORE UPDATE для DRIVER сделать:
2. В триггере на AFTER UPDATE для DRIVER:
Ну, с процедурой всё понятно, её рассматривать нет смысла...
Вопрос - как считаете такой механизм достаточно жизнеспособен, ли я чего-то не учёл? Вроде после изменения в BU значения WORKID оно должно быть доступно в AU именно в изменённом значении?
Есть мысль попытаться это автоматизировать таким образом:
Таблица водителей, ну пусть такая:
Код: Выделить всё
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 /* Время ухода с работы */
);
Код: Выделить всё
IF (OLD.STATEID=0 AND NEW.STATEID<>0) THEN
NEW.WORKID = GEN_ID(GEN_DRVWRK, 1);
Код: Выделить всё
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 именно в изменённом значении?