![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Триггер на удаление [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, "материнской таблице" :(