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

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

помогите правильно построить 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]

По правде говоря твоя таблица спроектирована с грубейшим нарушением нормальных форм.
Любые два неключевых поля не должны зависеть друг от друга. Они должны зависеть только от полного первичного ключа.


Наверх

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