Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

В триггере узнать какие поля обновились


Sour ©   (2005-02-18 11:04:00) 

Есть триггер Before Insert для некоторой таблицы. В нем надо определить не изменилось ли поле field1.

Как это сделать правильно?

Я пробую так:
new.field1 <> old.field1.

Эта конструкция хорошо работает, но если старое или новое значение is null, тогда не хочет.

Firebird 1.5


stud   (2005-02-18 13:21:00) [1]

а если например так?
if ((coalesce(old.naim,'-1'))<>(coalesce(new.naum,'-1'))) then


ЮЮ   (2005-02-18 11:33:00) [2]

1)
if
 (new.field1 IS NULL) AND NOT (old.field1 IS NULL) OR
 NOT (new.field1 IS NULL) AND (old.field1 IS NULL) OR
 (new.field1 <> old.field1)
then
 изменилось

2)
if
 NOT (
   (new.field1 IS NULL) AND (old.field1 IS NULL) OR
   (new.field1 = old.field1)
 )
then
 изменилось


Sergey13   (2005-02-18 11:32:00) [3]

[2] Sour   (18.02.05 11:25)
>Я подозреваю нельзя сравнивать null со значением какого-либо типа, т.к. проверка на null выполняется конструкцией is null.

Зато можно проверить что то на NULL.
If (old.field is Null) and (new.field is not Null) then ....


P.N.P.   (2005-02-18 11:30:00) [4]

Речь идет о проверке на null :
 if (new.field1 <> old.field1)or
((new.field1 is null and not old.field1 is null)or
(old.field1 is null and not new.field1 is null)) then
begin

end


Sour   (2005-02-18 11:25:00) [5]

Какая еще религия?
Более подробно:
1.
 //new.filed1 = 'привет';
 //old.filed1 = 'пока';
 if (new.field1 <> old.field1) then
 begin
   // в этом случае попадаем в этот блок
 end

2.
 //new.filed1 = 'привет';
 //old.filed1 = null;
 if (new.field1 <> old.field1) then
 begin
   // в этом случае сюда НЕ попадаем!!!!
   // хотя должны
 end

3.
 //new.filed1 = null;
 //old.filed1 = 'пока';
 if (new.field1 <> old.field1) then
 begin
   // в этом случае тоже сюда НЕ попадаем!!!!
   // хотя должны
 end

Я подозреваю нельзя сравнивать null со значением какого-либо типа, т.к. проверка на null выполняется конструкцией is null.

Поэтому и спрашиваю как узнать, что поле изменило значение, независимо от того какое оно было и какое стало (включаю null-значения).


Sergey13   (2005-02-18 11:06:00) [6]

> но если старое или новое значение is null, тогда не хочет.

Хм. А проверить это условие в тригере религия не позволяет?


Наверх

Титульная страница Поиск, карта сайта Написать письмо