Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Рекурсивный триггер  [new]
steph
Member

Откуда:
Сообщений: 9
Вечер добрый.Собственно написал триггер.
В таблице Party - содержатся номера игр , в Game- положение фигур в игре, при этом на доске не должно быть 2-х фигур одинакового типа одного цвета( собственно этим и занят триггер)

CREATE TABLE Party ( 
  ID number(9) NOT NULL PRIMARY KEY
  )
  /
CREATE TABLE Game( 
Nr number(9) NOT NULL,
ID number(9) NOT NULL,
Type char(2),
Color char(2),
constraint ID_fk
        FOREIGN KEY (ID)
                REFERENCES Party,
        constraint Game_pk
          PRIMARY KEY(Nr,ID)
  )
/ 
create or replace trigger Game_U
 BEFORE insert on Game FOR EACH ROW
 DECLARE 
 count_figure INTEGER;
   begin
   if(:NEW.Type='k')
	THEN
   SELECT count(*) INTO count_figure FROM Game WHERE Type=:NEW.Type AND Color=:NEW.Color AND ID=:NEW.ID;
   if(count_figure>=1)
	THEN
	       raise_application_error(-20500,'There are no more figures on the board');
	END IF;
	if(count_figure=0)
	THEN
	INSERT INTO Game VALUES(:NEW.Nr,:NEW.ID,:NEW.Type,:NEW.Color);
	END IF;
	END IF;
   end;
/
INSERT INTO Party (Id,Winner) VALUES (1,'w');
INSERT INTO  Game(Nr,Id,Type,Color) VALUES (1,1,'k','w');
INSERT INTO  Game(Nr,Id,Type,Color) VALUES (2,1,'k','b');

После запуска получаю ошибку
ora-00036:maximum number of recursive SQL levels (50) exceeded
Задача именно написать триггер.Как я понял - у меня получился в итоге рекурсивный триггер , что с ним можно сделать , чтобы он стал адекватно работать ?
16 дек 10, 03:47    [9946045]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный триггер  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18481
steph
что с ним можно сделать , чтобы он стал адекватно работать ?
почитать что такое триггер, как и когда он работает и где его можно/нужно использовать, а где -- противопоказано
Тому, кто дал тебе задачу "обеспечить триггером уникальность фигур одного цвета" можешь показать свой предыдущий топик, там неоднократно сказали, что триггером это делать не надо, на это существуют констрейнты. (Эту тему не показывай, здесь видна твоя полная безграмотность в части написания триггеров)

Если же все-таки стоит задача "через триггер", то надо думать о многопользовательской работе, блокировках, обходе мутации и т.д. -- это явно не начальный уровень
16 дек 10, 04:01    [9946049]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить