powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / 8.3 Нужна помощь в написании синтаксиса триггера
9 сообщений из 9, страница 1 из 1
8.3 Нужна помощь в написании синтаксиса триггера
    #35170789
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
B 8.2 все работает без проблем

AFTER .... I U D
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
IF (TG_OP = 'UPDATE') THEN 

IF  NEW.num_ext_speed<>OLD.num_ext_speed THEN
 INSERT INTO log_ipfw_tbl(name_log_ipfw) VALUES ('bla-bla-lba');
end if;

RETURN NEW;
END IF;
...

В 8.3 если значение NEW(OLD).num_ext_speed is null условие не выполняется !?
я все трыжды перпроверил и я чесно говоря в шоке!
...
Рейтинг: 0 / 0
8.3 Нужна помощь в написании синтаксиса триггера
    #35170845
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упрощенно, если один из операндов NULL, то логическое выражение равно NULL (false)
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
8.3 Нужна помощь в написании синтаксиса триггера
    #35170893
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
и как теперь с этой простотой работать?
2 этажа приклеивать?


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
....
IF (TG_OP = 'UPDATE') 
THEN 

IF  NEW.num_ext_speed<>OLD.num_ext_speed 
OR (NEW.num_ext_speed IS NULL AND OLD.num_ext_speed IS NOT NULL)
OR (OLD.num_ext_speed IS NULL AND NEW.num_ext_speed IS NOT NULL)
THEN
 INSERT INTO log_ipfw_tbl(name_log_ipfw) VALUES ('bla-bla-lba');
end if;

RETURN NEW;
END IF;
...

стыдно писать, то эта (да простят меня модеры) "хрень" только так сейчас и работет.

P.S.
Очень надеюсь что я окажуть не прав и меня поправят!!!
...
Рейтинг: 0 / 0
8.3 Нужна помощь в написании синтаксиса триггера
    #35170934
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Рекомендую ознакомиться с документацией (там всего одна страница текста)
http://www.postgresql.org/docs/8.2/interactive/functions-comparison.html
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
8.3 Нужна помощь в написании синтаксиса триггера
    #35171047
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Степан H.B 8.2 все работает без проблем

AFTER .... I U D
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
....
IF (TG_OP = 'UPDATE') THEN 

IF  NEW.num_ext_speed<>OLD.num_ext_speed THEN
 INSERT INTO log_ipfw_tbl(name_log_ipfw) VALUES ('bla-bla-lba');
end if;

RETURN NEW;
END IF;
...

В 8.3 если значение NEW(OLD).num_ext_speed is null условие не выполняется !?
я все трыжды перпроверил и я чесно говоря в шоке!Поздравляю Вас, Степан ! Вот наконец Вы и открыли для себя что логика в SQL не двоичная а третичная ;) кроме true и false есть ещё null. Насчёт 8.2 Вы ошибаетесь, и в 8.2 и в 8.3 всё точно так же. Более того - точно так же должно быть везде, в любой реализации SQL

Код: plaintext
1.
2.
3.
IF  NEW.num_ext_speed<>OLD.num_ext_speed 
OR (NEW.num_ext_speed IS NULL AND OLD.num_ext_speed IS NOT NULL)
OR (OLD.num_ext_speed IS NULL AND NEW.num_ext_speed IS NOT NULL)
THEN
вместо такой записи можно написать проще, нужно только знать, какое значение поля никогда не встречается. допустим это будет -1:
Код: plaintext
1.
IF  coalesce(NEW.num_ext_speed, - 1 )<>coalesce(OLD.num_ext_speed, - 1 )
THEN
то есть, после открытия для себя null и того что он не равен true и не равен false и того что результат почти любого выражения содержащего null становится равен null, логично было бы изучить функцию coalesce

ещё обратите внимание на такие хитрые логические выражения как:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
seb=> select true or null;
 ?column?
----------
 t
( 1  запись)

seb=> select false and null;
 ?column?
----------
 f
( 1  запись)

:)
...
Рейтинг: 0 / 0
8.3 Нужна помощь в написании синтаксиса триггера
    #35171051
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
... читал я это еще давным давно, отчего все не упомнищь, однако ...

Спасибо Dan Black
Заставил все-таки все перепроверить. действительно, если один из операндов NULL .. то ...

Остался последний вопрос ...
Есть ли более красивое решение чем выше изложеный код?
...
Рейтинг: 0 / 0
8.3 Нужна помощь в написании синтаксиса триггера
    #35171068
LeXa NalBat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
?

(new=old) is not true
...
Рейтинг: 0 / 0
8.3 Нужна помощь в написании синтаксиса триггера
    #35171079
Фотография Степан H.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёш
Поздравляю Вас, Степан ! Вот наконец Вы и открыли для себя что логика в SQL не двоичная а третичная ;)


Спасибо!
Поздравления принимаю, однако открыл я для себя не треичную логику т.к. представляю разницу между Null и not Null
а строчку полсотней строк выше которая присваивала мереметру NEW.=0
а ниже строчку котоая это значение убирала обратно в Null

Однако вины с себы не снимаю за преждевременный "кипиш" и сомнения отличной базе PostgreSQL.
Скорее всего пойду отосплюсь т.к. стал невнимательный миграция всего этого измотала.

Всем спасибо.
...
Рейтинг: 0 / 0
8.3 Нужна помощь в написании синтаксиса триггера
    #35171103
Dan Black
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в конкретном случае будет
Код: plaintext
IF NEW.num_ext_speed IS DISTINCT FROM OLD.num_ext_speed THEN
Код: plaintext
1.
----------------------------
 Verba volent, scripta manent 
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / 8.3 Нужна помощь в написании синтаксиса триггера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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