Триггеры

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Ответить
Dr0n
Сообщения: 6
Зарегистрирован: 21 авг 2006, 13:33

Триггеры

Сообщение Dr0n » 21 авг 2006, 13:56

Доброго времени суток, господа БД-шники.
Возник вопрос при создании тригера:
Необходимо, чтобы при добавлении записи в таб. 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.

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

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 21 авг 2006, 14:01

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

Dr0n
Сообщения: 6
Зарегистрирован: 21 авг 2006, 13:33

Сообщение Dr0n » 21 авг 2006, 15:02

Спасибо все что необходимо нашел

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

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

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 в тригеррах

Dr0n
Сообщения: 6
Зарегистрирован: 21 авг 2006, 13:33

Сообщение Dr0n » 21 авг 2006, 16:17

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

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.
Почему?

CyberMax
Заслуженный разработчик
Сообщения: 638
Зарегистрирован: 31 янв 2006, 09:05

Сообщение CyberMax » 21 авг 2006, 17:23

Может быть через двоеточие tres в апдейте писать...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 авг 2006, 17:39

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

Dr0n
Сообщения: 6
Зарегистрирован: 21 авг 2006, 13:33

Сообщение Dr0n » 21 авг 2006, 17:51

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

Dr0n
Сообщения: 6
Зарегистрирован: 21 авг 2006, 13:33

Сообщение Dr0n » 23 авг 2006, 10:29

Исче один вопрос по этой - же теме в вдогонку...

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

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

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

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 23 авг 2006, 11:02

exit и есть, посмотри еще
www.ibase.ru/devinfo/testiu.htm
там примеры обновления/вставки по условию.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 23 авг 2006, 12:49

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

Dr0n
Сообщения: 6
Зарегистрирован: 21 авг 2006, 13:33

Сообщение Dr0n » 23 авг 2006, 17:28

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

Ответить