|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
Здравствуйте! Подскажите пож-ста. У меня есть таблицы - Продукция, Сырье, Потери и Производство. PostgreSQL. Нужно написать триггерную функцию и сам триггер к функции. Который бы обновлял колонку "Запас_сырья" в таблице "Сырьё" при добавлении записи в таблицу "производство". А именно, нужно из запаса сырья вычесть нормы затрат сырья на ед. продукции умноженную на "план_выпуска" продукции. Вот код функции: CREATE OR REPLACE FUNCTION my_function_resursi() RETURNS TRIGGER AS $$ BEGIN IF NEW."План_выпуска" IS NOT NULL THEN UPDATE "Сырьё" SET "Сырьё"."Запас_сырья" = "Сырьё"."Запас_сырья" - ("Производство"."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции") FROM "Сырьё", "Производство", "Потери", "Продукция" WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья" AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции"; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;[/SQL] код триггера: CREATE TRIGGER "Please_work" AFTER INSERT ON "Производство" FOR EACH ROW EXECUTE PROCEDURE my_function_resursi(); Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется. Таблицы картинками прикрепил. Помогите пож-ста.[ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 21:58 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb Здравствуйте! Подскажите пож-ста. У меня есть таблицы - Продукция, Сырье, Потери и Производство. PostgreSQL. Нужно написать триггерную функцию и сам триггер к функции. Который бы обновлял колонку "Запас_сырья" в таблице "Сырьё" при добавлении записи в таблицу "производство". А именно, нужно из запаса сырья вычесть нормы затрат сырья на ед. продукции умноженную на "план_выпуска" продукции. Вот код функции: CREATE OR REPLACE FUNCTION my_function_resursi() RETURNS TRIGGER AS $$ BEGIN IF NEW."План_выпуска" IS NOT NULL THEN UPDATE "Сырьё" SET "Сырьё"."Запас_сырья" = "Сырьё"."Запас_сырья" - ("Производство"."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции") FROM "Сырьё", "Производство", "Потери", "Продукция" WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья" AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции"; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;[/SQL] код триггера: CREATE TRIGGER "Please_work" AFTER INSERT ON "Производство" FOR EACH ROW EXECUTE PROCEDURE my_function_resursi(); Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется. Таблицы картинками прикрепил. Помогите пож-ста.[ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 21:58 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb Здравствуйте! Подскажите пож-ста. У меня есть таблицы - Продукция, Сырье, Потери и Производство. PostgreSQL. Нужно написать триггерную функцию и сам триггер к функции. Который бы обновлял колонку "Запас_сырья" в таблице "Сырьё" при добавлении записи в таблицу "производство". А именно, нужно из запаса сырья вычесть нормы затрат сырья на ед. продукции умноженную на "план_выпуска" продукции. Вот код функции: CREATE OR REPLACE FUNCTION my_function_resursi() RETURNS TRIGGER AS $$ BEGIN IF NEW."План_выпуска" IS NOT NULL THEN UPDATE "Сырьё" SET "Сырьё"."Запас_сырья" = "Сырьё"."Запас_сырья" - ("Производство"."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции") FROM "Сырьё", "Производство", "Потери", "Продукция" WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья" AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции"; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;[/SQL] код триггера: CREATE TRIGGER "Please_work" AFTER INSERT ON "Производство" FOR EACH ROW EXECUTE PROCEDURE my_function_resursi(); Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется. Таблицы картинками прикрепил. Помогите пож-ста.[ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 21:59 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb Здравствуйте! Подскажите пож-ста. У меня есть таблицы - Продукция, Сырье, Потери и Производство. PostgreSQL. Нужно написать триггерную функцию и сам триггер к функции. Который бы обновлял колонку "Запас_сырья" в таблице "Сырьё" при добавлении записи в таблицу "производство". А именно, нужно из запаса сырья вычесть нормы затрат сырья на ед. продукции умноженную на "план_выпуска" продукции. Вот код функции: CREATE OR REPLACE FUNCTION my_function_resursi() RETURNS TRIGGER AS $$ BEGIN IF NEW."План_выпуска" IS NOT NULL THEN UPDATE "Сырьё" SET "Сырьё"."Запас_сырья" = "Сырьё"."Запас_сырья" - ("Производство"."План_выпуска" * "Потери"."Нормы_затрат_сырья_на_ед_продукции") FROM "Сырьё", "Производство", "Потери", "Продукция" WHERE "Сырьё"."Код_сырья" = "Потери"."Код_сырья" AND "Сырьё"."Код_сырья" = "Продукция"."Код_сырья" AND "Продукция"."Код_продукции" = "Производство"."Код_продукции" AND "Потери"."Код_продукции" = "Производство"."Код_продукции"; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;[/SQL] код триггера: CREATE TRIGGER "Please_work" AFTER INSERT ON "Производство" FOR EACH ROW EXECUTE PROCEDURE my_function_resursi(); Ошибок никаких не выдает, но и не работает. Ничего вообще не изменяется. Таблицы картинками прикрепил. Помогите пож-ста.[ ... |
|||
:
Нравится:
Не нравится:
|
|||
10.04.2021, 21:59 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb, Не вижу в команде UPDATE ссылок на NEW. А ведь весь смысл триггера сделать обновление на основании значений из записи NEW. Похожий пример можете посмотреть вот здесь . В самом конце есть два задания и ответы к ним. Второе задание про автоматическое вычисление суммы заказа очень похоже на то, что вам нужно. В решении используются переходные таблицы, поэтому требуется PostgreSQL 10 или выше. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 10:35 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 21:22 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 21:35 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb, Молодой человек... а вы умеет не картинки постить все таки а код который можно скопировать/отредактировать и показать исправленный? Уважайте тех кто вам пытается помочь. Начали же правильно почти с кода (хотя итог тоже стоило текстом запостить). -- Maxim Boguk лучшая поддержка PostgreSQL: dataegret.ru ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2021, 23:41 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет Не только в SET. Если что-то добавили в Производство, это же не значит, что нужно в Сырье поменять всё. Нужно поменять только то Сырье, которое относится к новой строке в Производстве. А на картинке я не вижу ограничений на Сырье. И согласен с Максимом, по картинкам сложно что-то конкретное рекомендовать. Полноценный пример в psql существенно упростил бы помощь. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 10:11 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
Павел Лузанов AlexSereb Павел Лузанов, это в SET нужно добавить NEW. к "План_выпуска" ? Добавил, но ничего не изменилось, ошибок никаких не показывает но и ничего не происходит. Изменений нет Не только в SET. Если что-то добавили в Производство, это же не значит, что нужно в Сырье поменять всё. Нужно поменять только то Сырье, которое относится к новой строке в Производстве. А на картинке я не вижу ограничений на Сырье. И согласен с Максимом, по картинкам сложно что-то конкретное рекомендовать. Полноценный пример в psql существенно упростил бы помощь. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Ограничение стоит в WHERE через код_сырья и код_продукции ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 12:19 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb, Исходя из предоставленной информации: 1. Попробуйте в триггере вместо UPDATE выполнить RAISE NOTICE '%', NEW; и посмотреть работает ли триггер вообще. Есть подозрение что ваш UPDATE не срабатывает. 2. Попробуйте выполнить текущий вариант UPDATE без триггера, напрямую в psql или pgadmin. Замените NEW."План_выпуска" на число, которое добавляете, и посмотрите что получается. Это то, что нужно? Если нет, добейтесь от UPDATE нужного поведения. 3. Замените RAISE NOTICE на правильно работающий UPDATE. ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 16:02 |
|
Триггерная функция PostgreSQL
|
|||
---|---|---|---|
#18+
AlexSereb, внимательно про NEW, OLD почитайте - https://www.postgresql.org/docs/12/plpgsql-trigger.html ... |
|||
:
Нравится:
Не нравится:
|
|||
12.04.2021, 20:47 |
|
|
start [/forum/topic.php?fid=53&msg=40061757&tid=1994086]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
32ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 255ms |
total: | 390ms |
0 / 0 |