Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.01.28;
Скачать: CL | DM;

Вниз

помогите правильно построить TRIGGER   Найти похожие ветки 

 
kserg@ukr.net   (2001-12-21 18:31) [0]

В таблице среди набора полей есть два поля, логически связанных (напр. Field1 и Field2).
Прошу помочь создать триггер на UPDATE,
котр. в случае модификации поля Field1 проверял бы Field2 и если оно isNull, то UPDATE SET Field2=Field1
Я не понимаю, как проверить, что поле Field1 изменилось?


 
Mick   (2001-12-21 18:35) [1]

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


 
TSV   (2001-12-21 20:30) [2]

А вообще примерно так:

CREATE TRIGGER T_UPD_TABLE1 ON TABLE1 FOR UPDATE AS

IF UPDATE(FIELD1)
BEGIN
..........
..........
END

Это синтаксис для MSSQL. Думаю, в IB примерно так же.

Удачи.


 
Desdechado   (2001-12-22 16:37) [3]

в 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-22 17:54) [4]

> Desdechado

UPDATE(column_name) - функция, которая определяет, изменено ли поле в таблице.


 
Desdechado   (2001-12-23 15:09) [5]

2 TSV
я имел ввиду команду SQL для модификации строки, а не функцию MSSQL


 
kserg@ukr.net   (2001-12-24 11:26) [6]

>Mick
Замечание воспринято. На самом деле я неточно выразился: поля Field1 / Field2 логически не связаны - просто юзер может сразу вносить инфо в поле Field1 минуя Field2. вот и необходимо как заполнить пустое поле Field2.


> Desdechado
Благодарю за ценное замечание, а то действительно можно с UPDATE-том
залететь.


 
kserg@ukr.net   (2001-12-24 12:15) [7]

>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


 
Romkin   (2001-12-24 12:29) [8]

BEFORE UPDATE pls...


 
kserg@ukr.net   (2001-12-24 12:56) [9]

> 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


 
Alexandr   (2001-12-24 13:06) [10]

в сравнении не забывайте проверять на null (3-значная логика. Оратите внимание на действия с ней)
если null значения возможны, то по ним нужно , как правило, писать отдельные условия


 
Romkin   (2001-12-24 13:15) [11]

Триггер написан практически правильно, затык действительно может быть
в NULLs (Alexandr совершенно верно сказал)
1. DATE_PAYED IS NULL - OLD или NEW, неважно - тогда if не выполнится
2. DATE_TOPAY - не NULL (смотри, что пхается из таблицы, сделай TField.Clear и тд)


 
kserg@ukr.net   (2001-12-24 13:24) [12]

>Alexandr
> Romkin - так и есть: поля DATE_PAYED и DATE_TOPAY могут быть NULL.


 
Alexandr   (2001-12-24 13:27) [13]

ну и вот


 
Romkin   (2001-12-24 13:32) [14]

А условие уже написать не можешь?
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


 
kserg@ukr.net   (2001-12-24 14:04) [15]

>Romkin - спасибо огромное.
Сам действительно не могу - задергали по др. вопросам.
Теперь всё работает.
Пользуясь случаем - поздравляю всех с наступающим Новым годом!



Страницы: 1 вся ветка

Текущий архив: 2002.01.28;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.009 c
3-90241
Грифон
2001-12-22 00:59
2002.01.28
возникла следующая проблемка:


6-90330
VS
2001-11-06 12:32
2002.01.28
Наставьте на путь истинный!


1-90243
Хлор
2002-01-08 05:43
2002.01.28
Здравствуйте! Пиплы подскажите как сохранить все форму с объектами наход. на ней


1-90259
SergeyNew
2002-01-07 11:12
2002.01.28
Две колонки в ListBox


1-90275
Mr. API
2001-12-27 19:31
2002.01.28
работа с архивами