powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Что-то типа триггера
12 сообщений из 12, страница 1 из 1
Что-то типа триггера
    #33992267
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть таблица
table1(p1 int,p2 text,p3 int);
и таблица
table2(p1 int,p2 int,p3 text);
Нужно, чтобы при выполнении UPDATE table1 SET p3=0 (или 1) WHERE p1=3;
в таблицу table2 добавлялась строка p1-просто id,p2 это число, которое присвоилось полю table1.p3 (текущее после UPDATE), а в поле table2.p3 имя пользователя, который выполнил UPDATE.
Как это можно реализовать?
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33992854
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Триггером на UPDATE


=====================================
Страну, в которой все ходят на бровях,
на колени не поставишь...
=====================================
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33992932
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проблема в том, что добавлять в table2 нужно только при UPDATE поля table1.p3, при обновлении других полей INSERT делать не надо. Вот и не знаю, как это сделать.
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33993008
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
posttПроблема в том, что добавлять в table2 нужно только при UPDATE поля table1.p3, при обновлении других полей INSERT делать не надо. Вот и не знаю, как это сделать.

if new.p3!=old.p3 then
insert into table2...
end if;
...
return new;
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33996581
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
CREATE OR REPLACE FUNCTION my_trigger_func()
RETURNS "trigger" AS
$BODY$
begin
if new.p3!=old.p3 then
INSERT INTO table2 (p2) VALUES (new.p3);
end if;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tg_my
AFTER UPDATE
ON table1
FOR EACH ROW
EXECUTE PROCEDURE my_trigger_func();

Выдает ошибку при UPDATE.
Код: plaintext
1.
2.
ERROR:  control reached end of trigger procedure without RETURN
КОНТЕКСТ:  PL/pgSQL function "my_trigger_func"
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33996632
wbear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
.....
INSERT INTO table2 (p2) VALUES (new.p3);
end if;
RETURN NEW;
end;
.......
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33996907
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как в функции для триггера использовать неизменяемые поля для проверки условий. Так не работает:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
CREATE OR REPLACE FUNCTION my_trigger_func()
RETURNS "trigger" AS
$BODY$
begin
if new.p3!=old.p3 then 
   if new.p4='значение1' then
     INSERT INTO table2 (p2,p5) VALUES (new.p3,'1');
   end if;
   
   if new.p4='значение2' then
     INSERT INTO table2 (p2,p5) VALUES (new.p3,'2');
   end if;
RETURN NEW;
end if;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;

CREATE TRIGGER tg_my
AFTER UPDATE
ON table1
FOR EACH ROW
EXECUTE PROCEDURE my_trigger_func();
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33997137
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А ты снова RETURN забыл. На сей раз вне условия new.p3!=old.p3


=====================================
Страну, в которой все ходят на бровях,
на колени не поставишь...
=====================================
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33997267
4321ё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кувалдин РоманА ты снова RETURN забыл. На сей раз вне условия new.p3!=old.p3
кроме того, для сравнения полей (в случае их необязательности) я бы рекомендовал
IS DISTINCT FROM
вместо
<> or !=

(т.е. new.p3 IS DISTINCT FROM old.p3)
но, только где-то с 8-ки (в 7.4. эта байда не работает на сравнении внутренних переменных ф-й, но работате в нормальном SQL)
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33997291
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Return при редактировании не туда вставил..сорри. Но почему-то даже при правильной его вставке сравнения не работают, нужно, чтобы вставлялись в другую таблицу значения в зависимости от содержимого поля p4.
PS: плохо,что нет возможности редактировать сообщения...поторопишься, а потом не исправить.
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33997298
Фотография Кувалдин Роман
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
posttReturn при редактировании не туда вставил..сорри. Но почему-то даже при правильной его вставке сравнения не работают, нужно, чтобы вставлялись в другую таблицу значения в зависимости от содержимого поля p4.
PS: плохо,что нет возможности редактировать сообщения...поторопишься, а потом не исправить.

Проверь-ка, а с нерусскими значениями сравнения будут работать? Если да - то у тебя локаль в БД неправильно настроена.
...
Рейтинг: 0 / 0
Что-то типа триггера
    #33997698
postt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, проблема в локале была, на eng все ok. Спасибо за помощь.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Что-то типа триггера
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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