Определение изменения поля в триггере

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
dostap
Сообщения: 14
Зарегистрирован: 23 фев 2008, 13:30

Определение изменения поля в триггере

Сообщение dostap » 23 фев 2008, 14:00

Ну чтож, жизнь нас забрасывает. :wink:
Сервер FB2.1 17735 dialect 3
Мне надо определять изменения в поле

TRIGGER AFTER UPDATE
Кроме как

Код: Выделить всё

 IF(OLD.VAL = NEW.VALE OR (OLD.VAL IS NULL AND NEW.VAL IS NULL)) THEN BEGIN /*Not changed*/ END 
ELSE
 -- changed do some actions
Ничего в голову не приходит но как-то некузяво это.
И почему не работает такай вариант

Код: Выделить всё

IF(NOT(OLD.VAL = NEW.VALE OR (OLD.VAL IS NULL AND NEW.VAL IS NULL))) THEN some actions
Проверял на тестовой ХП

Код: Выделить всё

CREATE OR ALTER PROCEDURE SP_TEST_COMPARE (
    V1 INTEGER,
    V2 INTEGER)
RETURNS (
    RV1 INTEGER,
    RV2 INTEGER,
    RES VARCHAR(16))
AS
begin
 RV1 = V1;
 RV2 = V2;

 /*
Вариант 1 
if( v1 = v2 OR (V1 IS  NULL AND V2 IS  NULL) )THEN res = 'equal';
 else
 res = 'not equal';
  suspend;
*/
--Вариант 2  
if( not(v1 = v2 OR (V1 IS  NULL AND V2 IS  NULL)) )THEN res = 'not equal';
 else
 res = 'equal';
 suspend;
end
Результаты

Код: Выделить всё

Входные данные       Вар 1                 Вар 2
NULL  ,NULL             equal                  equal 
1       ,NULL             not equal             equal ????
NULL  ,1                  not equal             equal ????
2       ,1                  not equal             not equal
2       ,2                  equal                   equal

hvlad
Разработчик Firebird
Сообщения: 1244
Зарегистрирован: 21 мар 2005, 10:48

Re: Определение изменения поля в триггере

Сообщение hvlad » 23 фев 2008, 15:24

dostap писал(а):Ну чтож, жизнь нас забрасывает. :wink:
Сервер FB2.1 17735 dialect 3
IS [NOT] DISTINCT FROM

dostap
Сообщения: 14
Зарегистрирован: 23 фев 2008, 13:30

Сообщение dostap » 24 фев 2008, 00:59

IS [NOT] DISTINCT FROM
Стыдно тупить в моём возрасте, но признаюсь ничерта не понял.
А что оператор NOT не является отрицанием в лучшем смысле этого слова? по идее NOT (FALSE) = TRUE

И ещё : я полностью согласен что (VAL = NULL ) false
но почему (NULL = NULL ) <> TRUE ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 24 фев 2008, 01:03

но почему (NULL = NULL ) <> TRUE ?
ей-богу, стандартная таблица состояний трехзначной логики на каждом столбу висит, и почти в каждой книжке описана.
null <> null.
http://firebirdsql.org/manual/ru/nullgu ... ps-ru.html

не совсем там правильно, потому что любая проверка с null на самом деле unknown. См. книжку Дейта - там целый раздел про null. Вообще, в FK, и так далее.

Ответить