Форум программистов, компьютерный форум, киберфорум
Firebird/InterBase
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 31
1

Триггер перед обновлением

14.11.2014, 20:24. Показов 756. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый вечер! Есть следующие таблицы (на рисунке). Создаю триггер, который при обновлении полей таблицы CONT_POSTAVKA (т.е. при отгрузке материала со склада) будет обновлять количество материала на складе (поле MATERIAL.QUANTITY).
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
AS
BEGIN
  UPDATE material
  SET
  material.quantity=material.quantity+OLD.quantity-NEW.quantity
  WHERE
  material.quantity =(SELECT material.quantity FROM material
  WHERE material.mat_kod =(SELECT cont_zayavka.kod FROM cont_zayavka
  INNER JOIN material ON cont_zayavka.kod=material.mat_kod
  WHERE cont_zayavka.num_zayav =(SELECT postavka.num_zayav FROM postavka
  INNER JOIN cont_zayavka ON postavka.num_zayav=cont_zayavka.num_zayav AND postavka.num_str=cont_zayavka.num_str
  WHERE postavka.num_post =(SELECT cont_postavka.num_post FROM cont_postavka WHERE cont_postavka.num_act=NEW.num_act))));
END
В результате выдается ошибка: multiple rows in singleton select.
Подскажите, пожалуйста, как можно исправить приведенный выше запрос.
Миниатюры
Триггер перед обновлением  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2014, 20:24
Ответы с готовыми решениями:

Проверить данные перед обновлением
Добрый вечер. Ситуация такая: есть detailsView, при обновлении два параметра берёт из...

Перед обновлением вылетает прокси на linux mint13
В линуксе я полный 0. Установлен линукс минт 13, на нем настроен прокси сервер. Установлено две...

Триггер перед вставкой
Нужно написать триггер который перед вставкой данных проверяет: Если поставщик определённой...

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это...

2
912 / 877 / 62
Регистрация: 06.01.2010
Сообщений: 2,367
Записей в блоге: 6
15.11.2014, 01:34 2
Признаться, такого говнокода я не видел давно, возможно никогда.
Подзапрос 5го уровня, да еще и в UPDATE - это сильно.

По идее должно быть что-то типа такого:
SQL
1
2
3
UPDATE material
   SET quantity = quantity + OLD.quantity - NEW.quantity
 WHERE mat_kod = NEW.mat_kod;
Но т.к. как в документе отгрузки нет ссылки на материал (как так? кол-во же есть! пала жертвой бездумной нормализации?), то не пройдет.
Структура на схеме переусложнена. Особенно вся левая часть.
0
0 / 0 / 0
Регистрация: 16.12.2010
Сообщений: 31
15.11.2014, 11:21  [ТС] 3
Цитата Сообщение от arni Посмотреть сообщение
Но т.к. как в документе отгрузки нет ссылки на материал (как так? кол-во же есть! пала жертвой бездумной нормализации?), то не пройдет.
я понимаю, что я всё усложнила, но эта база нормализована до 3НФ и она делается исключительно в учебных целях, поэтому структуру изменять нельзя. как в таком случае написать триггер?

Добавлено через 4 часа 35 минут
SQL
1
2
3
4
5
6
7
8
9
10
11
12
AS
BEGIN
UPDATE material
  SET
  material.mquan=material.mquan+OLD.cpquan-NEW.cpquan
  WHERE
  material.matid=(SELECT material.matid FROM
  (((cont_zayavka
  INNER JOIN material ON cont_zayavka.matid=material.matid)
  INNER JOIN postavka ON cont_zayavka.zayavid=postavka.zayavid AND cont_zayavka.cznum_str=postavka.cznum_str)
  INNER JOIN cont_postavka ON postavka.postid=cont_postavka.postid) WHERE cont_postavka.cpnum_act=NEW.cpnum_act);
END
Вот так работает, сама разобралась
0
15.11.2014, 11:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.11.2014, 11:21
Помогаю со студенческими работами здесь

Триггер для добавления к строке название таблицы, в которой содержится триггер
Есть таблицы База_Практик. В неё добавляю предприятие, и автоматически нужно добавить это...

Триггер, вызывающий процедуру, в которой выполняется select к этой таблице (откуда был вызван триггер)
есть тригерр create or replace trigger quickstart.quickstart.ACRIONS_COMMIT_TR after update on...

Разработать триггер, запускаемый при занесении новой строки в таблицу. Триггер должен увеличивать счетчик ч
Разработать триггер, запускаемый при занесении новой строки в таблицу. Триггер должен увеличивать...

Т-Триггер на ИЛИ-НЕ элементах и что это за триггер?
Здравствуйте. Нужно построить схему Т-Триггера через ИЛИ-НЕ элементы. Вот сам триггер...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru