Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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 - спасибо огромное.
Сам действительно не могу - задергали по др. вопросам.
Теперь всё работает.
Пользуясь случаем - поздравляю всех с наступающим Новым годом!



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

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

Наверх





Память: 0.47 MB
Время: 0.004 c
3-90190
Сергей Щ.
2001-12-23 00:40
2002.01.28
Как паковать таблицу ?


6-90348
evgen_2001
2001-11-05 16:10
2002.01.28
Передача структуры по сокету


14-90363
wHammer
2001-12-03 11:09
2002.01.28
Складской учет и Delphi


6-90334
Di_wind
2001-11-06 16:27
2002.01.28
Книги.


4-90408
Dufe Rob
2001-11-27 01:03
2002.01.28
Открытие файла программой...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский