Гость
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Наивный вопрос по триггерам after update / 20 сообщений из 20, страница 1 из 1
02.11.2017, 16:22
    #39546819
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
Сделал такой триггер, чтобы обновлять дату изменения записи

автор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
02.11.2017, 17:07
    #39546849
qwwq
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
Ролг Хупин,

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

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

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

Или вы напутали в ваших тестах или посте или контрольный пример в студию.
Так как все равно наоборот тому что вы написали.
...
Рейтинг: 0 / 0
03.11.2017, 12:12
    #39547303
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
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
03.11.2017, 12:26
    #39547318
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
Моя ошибка, вопрос снят
...
Рейтинг: 0 / 0
17.11.2017, 11:57
    #39554985
shaman902
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
Добрый день, тыкните пожалуйста носом что не так
Код: 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
17.11.2017, 12:06
    #39554994
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
shaman902,

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

крайне странно написанный вот такой запрос?
Код: 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
17.11.2017, 12:26
    #39555017
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
shaman902,

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

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

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

а вы в конец функции RETURN NEW; добавили?
...
Рейтинг: 0 / 0
17.11.2017, 12:56
    #39555041
Lonepsycho
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
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
17.11.2017, 13:11
    #39555052
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Наивный вопрос по триггерам after update
Lonepsychoshaman902,

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

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

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

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

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

For i in 1..10 loop

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


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