![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
помогите правильно построить TRIGGER [IB5.x, ]
kserg@ukr.net © (2001-12-21 18:31:00)В таблице среди набора полей есть два поля, логически связанных (напр. Field1 и Field2).
Прошу помочь создать триггер на UPDATE,
котр. в случае модификации поля Field1 проверял бы Field2 и если оно isNull, то UPDATE SET Field2=Field1
Я не понимаю, как проверить, что поле Field1 изменилось?
kserg@ukr.net (2001-12-24 14:04:00) [1]>Romkin - спасибо огромное.
Сам действительно не могу - задергали по др. вопросам.
Теперь всё работает.
Пользуясь случаем - поздравляю всех с наступающим Новым годом!
Romkin (2001-12-24 13:32:00) [2]А условие уже написать не можешь?
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
Alexandr (2001-12-24 13:27:00) [3]ну и вот
kserg@ukr.net (2001-12-24 13:24:00) [4]>Alexandr
> Romkin - так и есть: поля DATE_PAYED и DATE_TOPAY могут быть NULL.
Romkin (2001-12-24 13:15:00) [5]Триггер написан практически правильно, затык действительно может быть
в NULLs (Alexandr совершенно верно сказал)
1. DATE_PAYED IS NULL - OLD или NEW, неважно - тогда if не выполнится
2. DATE_TOPAY - не NULL (смотри, что пхается из таблицы, сделай TField.Clear и тд)
Alexandr (2001-12-24 13:06:00) [6]в сравнении не забывайте проверять на null (3-значная логика. Оратите внимание на действия с ней)
если null значения возможны, то по ним нужно , как правило, писать отдельные условия
kserg@ukr.net (2001-12-24 12:56:00) [7]> 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
Romkin (2001-12-24 12:29:00) [8]BEFORE UPDATE pls...
kserg@ukr.net (2001-12-24 12:15:00) [9]>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
kserg@ukr.net (2001-12-24 11:26:00) [10]>Mick
Замечание воспринято. На самом деле я неточно выразился: поля Field1 / Field2 логически не связаны - просто юзер может сразу вносить инфо в поле Field1 минуя Field2. вот и необходимо как заполнить пустое поле Field2.
> Desdechado
Благодарю за ценное замечание, а то действительно можно с UPDATE-том
залететь.
Desdechado (2001-12-23 15:09:00) [11]2 TSV
я имел ввиду команду SQL для модификации строки, а не функцию MSSQL
TSV (2001-12-22 17:54:00) [12]> Desdechado
UPDATE(column_name) - функция, которая определяет, изменено ли поле в таблице.
Desdechado (2001-12-22 16:37:00) [13]в 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-21 20:30:00) [14]А вообще примерно так:
CREATE TRIGGER T_UPD_TABLE1 ON TABLE1 FOR UPDATE AS
IF UPDATE(FIELD1)
BEGIN
..........
..........
END
Это синтаксис для MSSQL. Думаю, в IB примерно так же.
Удачи.
Mick (2001-12-21 18:35:00) [15]По правде говоря твоя таблица спроектирована с грубейшим нарушением нормальных форм.
Любые два неключевых поля не должны зависеть друг от друга. Они должны зависеть только от полного первичного ключа.