Форум: "Базы";
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];
Внизпомогите правильно построить TRIGGER Найти похожие ветки
← →
kserg@ukr.net (2001-12-21 18:31) [0]В таблице среди набора полей есть два поля, логически связанных (напр. Field1 и Field2).
Прошу помочь создать триггер на UPDATE,
котр. в случае модификации поля Field1 проверял бы Field2 и если оно isNull, то UPDATE SET Field2=Field1
Я не понимаю, как проверить, что поле Field1 изменилось?
← →
Mick (2001-12-21 18:35) [1]По правде говоря твоя таблица спроектирована с грубейшим нарушением нормальных форм.
Любые два неключевых поля не должны зависеть друг от друга. Они должны зависеть только от полного первичного ключа.
← →
TSV (2001-12-21 20:30) [2]А вообще примерно так:
CREATE TRIGGER T_UPD_TABLE1 ON TABLE1 FOR UPDATE AS
IF UPDATE(FIELD1)
BEGIN
..........
..........
END
Это синтаксис для MSSQL. Думаю, в IB примерно так же.
Удачи.
← →
Desdechado (2001-12-22 16:37) [3]в IB по-другому.
if( ( old.Field1 <> new.Field1 ) and ( old.Field2 IS NULL ) ) then
new.Field2 = new.Field1; -- если поля должны быть равными
new.Field2 = old.Field1; -- если в Field2 сохранить предыд. сост-е Field1
И НИКАКИХ update, а то триггер сработает снова и зациклится!
← →
TSV (2001-12-22 17:54) [4]> Desdechado
UPDATE(column_name) - функция, которая определяет, изменено ли поле в таблице.
← →
Desdechado (2001-12-23 15:09) [5]2 TSV
я имел ввиду команду SQL для модификации строки, а не функцию MSSQL
← →
kserg@ukr.net (2001-12-24 11:26) [6]>Mick
Замечание воспринято. На самом деле я неточно выразился: поля Field1 / Field2 логически не связаны - просто юзер может сразу вносить инфо в поле Field1 минуя Field2. вот и необходимо как заполнить пустое поле Field2.
> Desdechado
Благодарю за ценное замечание, а то действительно можно с UPDATE-том
залететь.
← →
kserg@ukr.net (2001-12-24 12:15) [7]>Desdechado
Уважаемый, посмотри на мой триггер - чего не работает...
CREATE TRIGGER INVOICE_UPDATE FOR INVOICE AFTER UPDATE POSITION 0 AS
BEGIN
IF ((OLD.DATE_PAYED <> NEW.DATE_PAYED) and (OLD.DATE_TOPAY IS NULL)) THEN
BEGIN
NEW.ID_PERS_TOPAY = NEW.ID_PERS_PAYED;
NEW.DATE_TOPAY = NEW.DATE_PAYED;
END
END
← →
Romkin (2001-12-24 12:29) [8]BEFORE UPDATE pls...
← →
kserg@ukr.net (2001-12-24 12:56) [9]> Romkin - и с BEFORE тоже не обновляет...
Полскажите, в чём ошибка ?
CREATE TRIGGER INVOICE_UPDATE FOR INVOICE BEFORE UPDATE POSITION 0 AS
BEGIN
IF ((OLD.DATE_PAYED <> NEW.DATE_PAYED) and (OLD.DATE_TOPAY IS NULL)) THEN
BEGIN
NEW.ID_PERS_TOPAY = NEW.ID_PERS_PAYED;
NEW.DATE_TOPAY = NEW.DATE_PAYED;
END
END
← →
Alexandr (2001-12-24 13:06) [10]в сравнении не забывайте проверять на null (3-значная логика. Оратите внимание на действия с ней)
если null значения возможны, то по ним нужно , как правило, писать отдельные условия
← →
Romkin (2001-12-24 13:15) [11]Триггер написан практически правильно, затык действительно может быть
в NULLs (Alexandr совершенно верно сказал)
1. DATE_PAYED IS NULL - OLD или NEW, неважно - тогда if не выполнится
2. DATE_TOPAY - не NULL (смотри, что пхается из таблицы, сделай TField.Clear и тд)
← →
kserg@ukr.net (2001-12-24 13:24) [12]>Alexandr
> Romkin - так и есть: поля DATE_PAYED и DATE_TOPAY могут быть NULL.
← →
Alexandr (2001-12-24 13:27) [13]ну и вот
← →
Romkin (2001-12-24 13:32) [14]А условие уже написать не можешь?
if (New.Date_Payed is not null and OLD.Date_TOPAY is NULL) then
if (OLD.Date_Payed is NULL or OLD.DATE_PAYED <> NEW.DATE_PAYED) then
← →
kserg@ukr.net (2001-12-24 14:04) [15]>Romkin - спасибо огромное.
Сам действительно не могу - задергали по др. вопросам.
Теперь всё работает.
Пользуясь случаем - поздравляю всех с наступающим Новым годом!
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.028 c