Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите разобраться с триггером / 8 сообщений из 8, страница 1 из 1
14.04.2016, 10:40
    #39215362
iVaRela
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с триггером
Добрый день Уважаемые.
Есть таблица TB_PARAMS в которой всего несколько строк, но каждая строка обновляется с некой периодичностью

Код: sql
1.
2.
3.
4.
CREATE TABLE TB_PARAMS (
    ID  INTEGER NOT NULL,
    PARAM_VALUE  VARCHAR(256) NOT NULL
);



и есть таблица TB_REG_STRING

Код: sql
1.
2.
3.
4.
5.
CREATE TABLE TB_REG_STRING (
    ID  INTEGER NOT NULL,
    DT  TIMESTAMP,
    PARAM_VALUE  VARCHAR(256) NOT NULL
);



Нужно, чтобы при изменении значения поля PARAM_VALUE в таблице TB_PARAMS, в таблицу TB_REG_STRING записывалось новое значение этого поля и 'NOW' в поле DT.
При этом запись в таблицу TB_REG_STRING должна происходить ТОЛЬКО ЕСЛИ новое значение PARAM_VALUE отличается от того, которое записано в последней добавленной записи TB_REG_STRING.

В общем это некий журнал, который пишет все изменения поля PARAM_VALUE...

C 'NOW' все понятно:

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR ALTER TRIGGER TB_PARAMS_BU0 FOR TB_PARAMS
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  NEW.DT = 'NOW';
end
^



А как задать сравнение с последним значением? Вложенным SELECT-ом? Буду признателен за помощь.
...
Рейтинг: 0 / 0
14.04.2016, 10:54
    #39215385
DarkMaster
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с триггером
iVaRela,

Выбирай select`ом, что мешает?
...
Рейтинг: 0 / 0
14.04.2016, 10:55
    #39215387
Симонов Денис
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с триггером
iVaRela,

в общем-то изменение должно писать триггером AFTER UPDATE. Можно универсальный триггер написать чтобы работало как при вставке так и при изменении. Не уверен что вам там какое-то мифическое последнее значение нужно. Скорее всего достаточно в триггере на UPDATE таблицы TB_PARAMS сравнить старое и новое значение поля PARAM_VALUE. Читай про контекстные переменные NEW.* и OLD.*
...
Рейтинг: 0 / 0
14.04.2016, 10:58
    #39215392
Ivan_Pisarevsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с триггером
iVaRelaА как задать сравнение с последним значением?if (old.tra_la_la != new.tra_la_la) then и далее свою логику.

логирование традиционно пишут в афтер триггеры на логируемой таблице.

Это лаба-курсовик? Ели да, то сгодится, если нет, то схема данных плоха. таблица TB_PARAMS просто лишняя она мешает и будут гарантированные траблы с многоканальным доступом на запись.
...
Рейтинг: 0 / 0
14.04.2016, 10:58
    #39215393
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с триггером
iVaRela,

не совсем понятно, каков критерий записи в таблицу TB_REG_STRING значения PARAM_VALUE?
На таблицы какие-нибудь ограничения наложены в виде PRIMARY KEY и UNIQUE?

С уважением, Polesov.
...
Рейтинг: 0 / 0
14.04.2016, 11:41
    #39215433
iVaRela
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с триггером
Симонов ДенисiVaRela,

в общем-то изменение должно писать триггером AFTER UPDATE. Можно универсальный триггер написать чтобы работало как при вставке так и при изменении. Не уверен что вам там какое-то мифическое последнее значение нужно. Скорее всего достаточно в триггере на UPDATE таблицы TB_PARAMS сравнить старое и новое значение поля PARAM_VALUE. Читай про контекстные переменные NEW.* и OLD.*

Да, с BEFORE UPDATE это я ошибся.
...
Рейтинг: 0 / 0
14.04.2016, 11:52
    #39215449
iVaRela
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с триггером
PolesoviVaRela,

не совсем понятно, каков критерий записи в таблицу TB_REG_STRING значения PARAM_VALUE?
На таблицы какие-нибудь ограничения наложены в виде PRIMARY KEY и UNIQUE?

С уважением, Polesov.

PRIMARY KEY - поле ID, оно на генераторе висит, я опустил этот момент.
Уникальности нет.
Таблица TB_PARAMS должна хранить набор параметров (конфигурация устройства), этот набор может изменяться произвольно разными пользователями. Задача триггера - сохранить все изменения, которые были произведены в TB_PARAMS в таблице TB_REG_STRINGS.
Я понимаю, что можно обойтись без TB_PARAMS, и писать конфигурацию непосредственно в TB_REG_STRINGS методом INSERT OR UPDATE с условием OLD.PARAM_VALUE <> NEW.PARAM_VALUE, и в качестве конфигурации устройства выгружать из TB_REG_STRINGS последние записи, но будет ли этот способ быстрее чем тот, что я описал?
...
Рейтинг: 0 / 0
14.04.2016, 12:10
    #39215480
iVaRela
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите разобраться с триггером
Решил обойтись без TB_PARAMS. Сделаю вьюху на TB_REG_STRING и буду получать конфигурацию из нее.
Тему можно закрывать.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Помогите разобраться с триггером / 8 сообщений из 8, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]