powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / По примеру из русского Language Reference
19 сообщений из 19, страница 1 из 1
По примеру из русского Language Reference
    #39105136
Izya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет ли противоречия между примером

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
CREATE TRIGGER TR_CUST_LOG
ACTIVE AFTER INSERT OR UPDATE OR DELETE POSITION 10
ON CUSTOMER
AS
BEGIN
 INSERT INTO CHANGE_LOG (LOG_ID,
 ID_TABLE,
 TABLE_NAME,
 MUTATION)
 VALUES (NEXT VALUE FOR SEQ_CHANGE_LOG,
 OLD.CUST_NO,
 'CUSTOMER',
 CASE
 WHEN INSERTING THEN 'INSERT'
 WHEN UPDATING THEN 'UPDATE'
 WHEN DELETING THEN 'DELETE'
 END);
END



и фразой (пару абзацев ранее)

из описаловаКонтекстная переменная OLD (префикс имени столбца) для всех видов триггеров является переменной только для чтения. Она недоступна в триггерах, вызываемых при добавлении данных, независимо от фазы события.

?
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105183
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IzyaНет ли противоречия между примером

нет
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105205
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Единственное, что тут смущает - "неэкранированное" упоминание OLD в данном триггере с 'AFTER INSERT'.
По хорошему, должно быть что-то типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SET TERM ^;
CREATE TRIGGER TR_CUST_LOG
  ON CUSTOMER
  ACTIVE AFTER INSERT OR UPDATE OR DELETE
  POSITION 10
AS
BEGIN
  IF (INSERTING) THEN
    INSERT INTO CHANGE_LOG (LOG_ID, ID_TABLE, TABLE_NAME, MUTATION)
      VALUES (NEXT VALUE FOR SEQ_CHANGE_LOG, NEW.CUST_NO, 'CUSTOMER', 'INSERT');
  ELSE
    INSERT INTO CHANGE_LOG (LOG_ID, ID_TABLE, TABLE_NAME, MUTATION)
      VALUES (NEXT VALUE FOR SEQ_CHANGE_LOG, OLD.CUST_NO, 'CUSTOMER', IIF(UPDATING, 'UPDATE', 'DELETE'));
END^
SET TERM ;^
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105238
Izya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorНет

DBConstructorЕдинственное, что тут смущает - "неэкранированное" упоминание OLD в данном триггере с 'AFTER INSERT'.

"Нет", "смущает" или "неправильный пример"?
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105248
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггер откомпилируется, но работать будет только при обновлении и удалении. На добавление будет валить ошибку.
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105253
Izya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

А что, когда только INSERT, то с OLD вообще компилироваться не будет?
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105267
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Izya, а самому попробовать и убедиться не вариант? :)
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105269
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorЕдинственное, что тут смущает - "неэкранированное" упоминание OLD в данном триггере с 'AFTER INSERT'.
По хорошему, должно быть что-то типа:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
SET TERM ^;
CREATE TRIGGER TR_CUST_LOG
  ON CUSTOMER
  ACTIVE AFTER INSERT OR UPDATE OR DELETE
  POSITION 10
AS
BEGIN
  IF (INSERTING) THEN
    INSERT INTO CHANGE_LOG (LOG_ID, ID_TABLE, TABLE_NAME, MUTATION)
      VALUES (NEXT VALUE FOR SEQ_CHANGE_LOG, NEW.CUST_NO, 'CUSTOMER', 'INSERT');
  ELSE
    INSERT INTO CHANGE_LOG (LOG_ID, ID_TABLE, TABLE_NAME, MUTATION)
      VALUES (NEXT VALUE FOR SEQ_CHANGE_LOG, OLD.CUST_NO, 'CUSTOMER', IIF(UPDATING, 'UPDATE', 'DELETE'));
END^
SET TERM ;^



да так будет правильней. Поправлю
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105314
Izya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructor,

угу, давайтеперь Language Reference проверять.
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105353
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Izya, ты уже этим занимаешься, если не заметил. ;)
И да, проверить не помешает! Language Reference пишут не боги, а люди, которым свойственно ошибаться.
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105372
Izya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну ладно, ладно! Уболтали :)

Но я б просто поправил бы одну строку в исходном примере. Ради наглядности , что бы продемонстрировать, что OLD недоступен в INSERT (пусть даже в ущерб эффективности).

вместо
Код: sql
1.
OLD.CUST_NO


написал бы
Код: sql
1.
2.
3.
4.
CASE 
WHEN INSERTING THEN NEW.CUST_NO
ELSE OLD.CUST_NO
END
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105520
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов Денисда так будет правильней. Поправлю
Не будет правильнее. Не надо править. В универсальных триггерах OLD переменные просто NULL
при вставках.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105533
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

OLD то NULL, но пользователь скорее всего не ожидает увидеть это значение
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105555
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovВ универсальных триггерах OLD переменные просто NULL при вставках.
Дмитрий, в какой документации написано об этой немаловажной особенности?
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105570
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorв какой документации написано об этой немаловажной особенности?
Разумеется, в doc\README.universal_triggers.txt
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105602
miwaonline
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Симонов ДенисDimitry Sibiryakov,

OLD то NULL, но пользователь скорее всего не ожидает увидеть это значение
А что там еще можно ожидать в случае BI? NULL, как по мне, вполне логично.
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105618
Фотография Симонов Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
miwaonline,

логично конечно. Я говорю что сам пример такого содержать не должен. В примере предполагалось всё-таки писать текущее значение, а не NULL. Хотя уже не помню я ли добавлял этот пример или взял его из Language Reference Update
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105711
DBConstructor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovРазумеется, в doc\README.universal_triggers.txt
Спасибо! Я, как обычно, невнимателен или не обратил внимания.
...
Рейтинг: 0 / 0
По примеру из русского Language Reference
    #39105877
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DBConstructorДмитрий, в какой документации написано об этой немаловажной особенности?Не знаю, что в ней немаловажного/неожиданного, но таки в LRU это было описано уже давно.
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / По примеру из русского Language Reference
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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