powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Наивный вопрос по триггерам after update
20 сообщений из 20, страница 1 из 1
Наивный вопрос по триггерам after update
    #39546819
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал такой триггер, чтобы обновлять дату изменения записи

авторCREATE TRIGGER tr_customers_on_change
BEFORE UPDATE
ON public.customers FOR EACH ROW
EXECUTE PROCEDURE public.trproc_upd_customers();

CREATE OR REPLACE FUNCTION public.trproc_upd_customers (
)
RETURNS trigger AS
$body$
BEGIN
NEW.modified:=CURRENT_TIMESTAMP;
RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql';

После этого искал, почему не обновляется поле.
Изменил BEFORE UPDATE на AFTER UPDATE - все сработало.

Получается, что триггеры, которые должны менять что-то в таблице должны быть афтер апдейт.
А, если в триггере надо вписать в другую таблицу, то он может быть и бефоре.

Где я не прав?
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39546849
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

с утра пьёте, поруччик ?
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39546851
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qwwqРолг Хупин,

с утра пьёте, поруччик ?

с утра, но не сегодняшнего, было два выходных
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39546865
big-trot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
цитат из документацииКак правило, триггеры BEFORE уровня строки используются для проверки или модификации
данных, которые будут вставлены или изменены. Например, триггер BEFORE можно использовать
для вставки текущего времени в столбец timestamp или проверки, что два элемента строки
согласованы между собой. Триггеры AFTER уровня строки наиболее разумно использовать для
каскадного обновления данных в других таблицах или проверки согласованности сделанных
изменений с данными в других таблицах. Причина для такого разделения работы в том, что триггер
AFTER видит окончательное значение строки, в то время как для триггера BEFORE это не так, ведь
могут быть другие триггеры BEFORE, которые сработают позже. Если нет особых причин для выбора
между триггерами BEFORE или AFTER, то триггер BEFORE предпочтительнее, так как не требует
сохранения информации об операции до конца работы оператора.
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39547079
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

Или вы напутали в ваших тестах или посте или контрольный пример в студию.
Так как все равно наоборот тому что вы написали.
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39547303
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Maxim BogukРолг Хупин,

Или вы напутали в ваших тестах или посте или контрольный пример в студию.
Так как все равно наоборот тому что вы написали.

Вы правы, сделал пример - всё работает в Бефоре
Но странно, почему в реальной таблице не обновлялась дата

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
drop table if exists books;

create table if not exists books 
(id  serial NOT NULL PRIMARY KEY,
 title TEXT NOT NULL,
 data json NULL,
 modified timestamp default now(),
 modified_by text default CURRENT_USER
);

CREATE TRIGGER tr_books_on_change
BEFORE UPDATE 
ON public.books FOR EACH ROW 
EXECUTE PROCEDURE public.trproc_upd_books();

CREATE OR REPLACE FUNCTION public.trproc_upd_books (
)
RETURNS trigger AS
$body$
BEGIN
	NEW.modified:=CURRENT_TIMESTAMP;
	NEW.modified_by:=CURRENT_USER;
	RETURN NEW;
END;
$body$
LANGUAGE 'plpgsql';

INSERT INTO books (title,data)
VALUES
 ( 'The Tattooed Duke','{ "title": "The Tattooed Duke", "items": {"product": "Diaper","qty": 24}}'::json),
 ( 'She Tempts the Duke','{ "title": "She Tempts the Duke", "items": {"product": "Toy Car","qty": 1}}'::json),
 ( 'The Duke Is Mine','{ "title": "The Duke Is Mine", "items": {"product": "Toy Train","qty": 2}}'::json),
 ( 'What I Did For a Duke','{ "title": "What I Did For a Duke", "items": {"product": "Toy Train","qty": 2}}'::json),
 ( 'King Kong','{ "title": "King Kong", "items": {"product": "Toy Train","qty": 2}}'::json);


select * from books;

update books set title='Петя и Волк' where id=2;
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39547318
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Моя ошибка, вопрос снят
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39554985
shaman902
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, тыкните пожалуйста носом что не так
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
CREATE OR REPLACE FUNCTION triger_TP_10_6kV_update() RETURNS TRIGGER AS $BODY$
DECLARE
power1 integer;
power2 integer;
power3 integer;
i integer :=1;

Begin
For i in 1..10 loop

if (SELECT power_1 From "TP_10_6kV" where id = i) is null 
then power1 = 0;
else power1 = power_1;
end if;

if (SELECT power_2 From "TP_10_6kV" where id = i) is null 
then power2 = 0;
else power2 = power_2;
end if;

if (SELECT power_3 From "TP_10_6kV" where id = i) is null 
then power3 = 0;
else power3 = power_3;
end if;

UPDATE public."TP_10_6kV" SET power_nom = power1 + power2 + power3 where id = i;
end loop;
END;

$BODY$ LANGUAGE plpgsql;
--------------------------------------------------------
CREATE TRIGGER tr_update_power 
AFTER UPDATE OF power_1, power_2, power_3
ON  "TP_10_6kV" FOR EACH ROW 
EXECUTE PROCEDURE triger_TP_10_6kV_update();
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39554994
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shaman902,

а что не так по-вашему?
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555001
Melkij
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А что тут вообще происходит в триггере?

крайне странно написанный вот такой запрос?
Код: sql
1.
UPDATE public."TP_10_6kV" SET power_nom = coalesce(power1, 0) + coalesce(power2, 0) + coalesce(power3, 0) where id between 1 and 10;
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555017
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shaman902,

незнаю, как там с логикой, но RETURN части, по моему, не хватает...
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555020
shaman902
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
есть значения в полях power1, 2, 3 но может стоять и пустая ячейка - " оборудование не установленно"; нужна сумма по етим полям в результирующию при любых изменених полей power1, 2, 3
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555023
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shaman902,

а зачел луп делается по "всем?" рекордам в таблице, а не толко в той записи, которая изменяется?
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555027
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shaman902,

ну так делайте в бефоре тригере NEW.power_nom := NEW.power1 + NEW.power2 + NEW.power3; и псё...
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555032
shaman902
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Melkij,выполняеться без ошибок, но ничего не происходит ((
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555037
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shaman902,

а вы в конец функции RETURN NEW; добавили?
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555041
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shaman902,

Код: sql
1.
2.
3.
4.
5.
6.
7.
CREATE OR REPLACE FUNCTION triger_TP_10_6kV_update() RETURNS TRIGGER AS $BODY$
BEGIN
NEW.power_nom := COALESCE(NEW.power_1, 0) + COALESCE(NEW.power_2, 0) + COALESCE(NEW.power_3, 0);
RETURN NEW;
END;

$BODY$ LANGUAGE plpgsql;
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555052
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Lonepsychoshaman902,

а зачел луп делается по "всем?" рекордам в таблице, а не толко в той записи, которая изменяется?

и не по всем, а по магически определённым 10

For i in 1..10 loop
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555057
Lonepsycho
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг ХупинLonepsychoshaman902,

а зачел луп делается по "всем?" рекордам в таблице, а не толко в той записи, которая изменяется?

и не по всем, а по магически определённым 10

For i in 1..10 loop

да, я видел, но предпорожил, что это у него 10 штук записей в тесте, и он так их обновляет. правда зачем, не понятно. подозреваю, что так в нём пхп програмист говорит.
...
Рейтинг: 0 / 0
Наивный вопрос по триггерам after update
    #39555095
shaman902
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Lonepsycho,
Большое спасибо Вам, и Всем за советы - работает ))
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Наивный вопрос по триггерам after update
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]