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

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

Триггер на удаление [D7, IB5.x, IB6.x]


YurikGl ©   (2004-03-21 16:03:00) 

Если кому не лень, пожалуйта copy/paste-те мне триггер запрещающий удаление записи в метеринской таблице, если есть связанные в дочерней. А то в книжке только каскадное удаление приведено, а порывшись в ya с ходу тоже ничего не нашел. :(

Заранее спасибо.

З.Ы. Осваиваю interbase.


Zacho   (2004-03-21 20:44:00) [1]


> YurikGl ©   (21.03.04 19:13) [6]
> re [4] А почему не все?

А зачем все ? Достаточно, что бы хотя бы однавозвращалась запросом.


Domkrat   (2004-03-21 19:28:00) [2]

>если есть связанные в дочерней, значит, есть FOREIGN KEY
>а поэтому, при попытке удаления IB сам ругнется, без триггеров, >правда не очень понятными нерусскими словами

1. IBExpert->FOREIGN KEY (сразу получишь и триггер)
2. onDeleteError

И будет ругаться на русском.


YurikGl   (2004-03-21 19:13:00) [3]

re [4] А почему не все? И насколько это "не все"?


Sergey Masloff   (2004-03-21 18:03:00) [4]

Desdechado ©   (21.03.04 17:43) [4]
это самый лучший вариант.


Desdechado   (2004-03-21 17:43:00) [5]

если уж без переменной, то
IF( EXISTS( SELECT ... ) ) THEN
 EXCEPTION ...
кстати, тоже проверяет не все записи


Sergey Masloff   (2004-03-21 17:14:00) [6]

Или так:

CREATE TRIGGER TR_PLACES_BD0 FOR PLACES
ACTIVE BEFORE DELETE POSITION 0
AS
 DECLARE VARIABLE TMP INTEGER;
BEGIN
FOR SELECT NULL FROM Streets into :TMP
  WHERE place_id = old.place_id
DO
  EXCEPTION ex_DELPLACE;
END


Только жаль что нельзя "неименованый" курсор объявить (без INTO) - можно бы без переменной обойтись было. Тут выгода в чем - нам же неважно одна или 100000 дочерних записей. Главно есть или нет - и "мой" вариант может оказаться чуть быстрее


Desdechado   (2004-03-21 16:40:00) [7]

если есть связанные в дочерней, значит, есть FOREIGN KEY
а поэтому, при попытке удаления IB сам ругнется, без триггеров, правда не очень понятными нерусскими словами
CREATE TRIGGER TR_PLACES_BD0 FOR PLACES
ACTIVE BEFORE DELETE POSITION 0
AS
 DECLARE VARIABLE pl_no INTEGER;
BEGIN
 SELECT Count(*) FROM Streets
   WHERE place_id = old.place_id
   INTO :pl_no;
 IF( pl_no > 0 ) THEN
   EXCEPTION ex_DELPLACE;
END

по-русски можно так


YurikGl   (2004-03-21 16:06:00) [8]

sorry, "материнской таблице" :(


Наверх

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