Страница 1 из 1

Триггеры

Добавлено: 21 авг 2006, 13:56
Dr0n
Доброго времени суток, господа БД-шники.
Возник вопрос при создании тригера:
Необходимо, чтобы при добавлении записи в таб. Provodka при, вставке кол-ва, товаров., выполнялась проверка в табл. new_table в колонке kol_vo (должно быть меньше либо равно)…

Код: Выделить всё

ALTER TRIGGER provodka_bi0
active before insert position 0
AS
DECLARE VARIABLE t integer;
begin
  t=(select KOL_VO from new_table where new_table.id_tovara=id_tovara);

  if(new.kol<=t)
then
begin
POST_EVENT 'NEW_ORDER';
end
end
причем в режиме отладки все работает так как надо(IBEXPERT ), а при компиляции пишет такую гадость:
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Subselect illegal in this context.

Помогите плиз разобраться.

Добавлено: 21 авг 2006, 14:01
CyberMax
Тебе же написали - "подзапросы здесь недопустимы". По твоей проблеме:
http://www.sql.ru/forum/actualthread.aspx?tid=241052

Добавлено: 21 авг 2006, 15:02
Dr0n
Спасибо все что необходимо нашел

было с ошибкой:

Код: Выделить всё

t=(select KOL_VO from new_table where new_table.id_tovara=id_tovara)
переделал на:

Код: Выделить всё

select new_table.id_tovara from new_table where new_table.id_tovara=new.id_tovara into t;
!!!синтаксис языка SQL в тригеррах

Добавлено: 21 авг 2006, 16:17
Dr0n

Код: Выделить всё

CREATE trigger provodka_bi0 for provodka
active before insert position 0
AS
DECLARE VARIABLE tres integer;
begin
select new_table.kol_vo from new_table where new_table.id_tovara=id_tovara into tres;
if(new.kol<tres)then
update new_table set new_table.kol_vo=(tres-new.kol) where new_table.id_tovara=id_tovara;
end

такая вот ошибка
Column does not belong to referenced table.
Dynamic SQL Error.
SQL error code = -206.
Column unknown.
TRES.
At line 8, column 40.

не видит он почемуто локальную переменную TRES.
Почему?

Добавлено: 21 авг 2006, 17:23
CyberMax
Может быть через двоеточие tres в апдейте писать...

Добавлено: 21 авг 2006, 17:39
kdv
и еще помнить надо, что теоретически select into может
а) ничего не вернуть (null)
б) вернуть null как значение столбца считанной записи

Добавлено: 21 авг 2006, 17:51
Dr0n
CyberMax писал(а):Может быть через двоеточие tres в апдейте писать...
точно двоеточие, спасибо все получилось :wink:

Добавлено: 23 авг 2006, 10:29
Dr0n
Исче один вопрос по этой - же теме в вдогонку...

Существует ли команда для завершения работы триггера, в определенном месте (как EXIT в процедурах)?

Просто необходимо, при добавлении строки в табл., проверять, сущ. ли такая строка, если
1)нет (не существует), то далее продолжаем работу триггера, т.е он добавляет введенную строку в табл.,
2)да (существует), то в существующею строку обновить согласно введенной. Завершить работу триггера. И НЕ ДАТЬ ДОБОВЛЯТЬ ЭТУ СТРОКУ В ТАБЛИЦУ ЦЕЛИКОМ

Извиняйте если не точно объяснил

Добавлено: 23 авг 2006, 11:02
kdv
exit и есть, посмотри еще
www.ibase.ru/devinfo/testiu.htm
там примеры обновления/вставки по условию.

Добавлено: 23 авг 2006, 12:49
Merlin
Dr0n писал(а):Исче один вопрос по этой - же теме в вдогонку...
Мил человек, а чего бы тебе не почитать разА соответствующие главы в Language Reference и Data Definition Guide?

Добавлено: 23 авг 2006, 17:28
Dr0n
Merlin писал(а): Мил человек, а чего бы тебе не почитать разА соответствующие главы в Language Reference и Data Definition Guide?
Да уж не обессудьте, что задал вопрос, и не прочитал документацию. Думаю рейтинг форума от этого не упадет. :D
Merlin писал(а): exit и есть, посмотри еще
www.ibase.ru/devinfo/testiu.htm
там примеры обновления/вставки по условию.
Спасибо, тебе добрый человек, как раз то что необходимо.