Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Вниз

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




Форум: "Базы";
Поиск по всему сайту: delphimaster.net;
Текущий архив: 2002.01.28;
Скачать: [xml.tar.bz2];




Наверх





Память: 0.74 MB
Время: 0.015 c
1-90283           Григорий Ситнин       2002-01-10 15:28  2002.01.28  
Создание TFrame из внешней DLL... Вообще, реально?


1-90299           Даггер                2002-01-08 11:49  2002.01.28  
Хочется извратиться, а знаний не хватает...


14-90381          Ежик                  2001-12-02 18:31  2002.01.28  
А кто-то обещал выпустить к 1 декабря......


1-90245           LakeMan               2002-01-09 12:00  2002.01.28  
компонент TCrpe. Помогите пожалуйста


4-90413           AlexandrH             2001-11-28 09:22  2002.01.28  
Вопрос такой.....