powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не работает тригер на update before
16 сообщений из 16, страница 1 из 1
Не работает тригер на update before
    #39385993
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть тригер стоит на таблице как
"СREATE TRIGGER before_finace
BEFORE INSERT
ON pay
FOR EACH ROW
EXECUTE PROCEDURE "pay to finace before v2"();"

Сам тригер
"DECLARE
INSERT_SQL text;
OPTYPE text;
SUM bigint;
SYSTEM_DATE text;
TYPE_PAY text;
DESCR text;
_id bigint;

BEGIN
IF NEW.typepay_id != 2423331 THEN
IF NEW.paysum > 0 THEN
OPTYPE := 2;
ELSIF NEW.paysum < 0 and (NEW.typepay_id = 3181810 or NEW.typepay_id = 472295 or NEW.typepay_id = 57586)THEN
OPTYPE := 1;
ELSE
RAISE EXCEPTION 'Нельзя ставить отрицательный баланс киленту если это не перерасчет не повторка и не списание';
END IF;
NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
select now()::timestamp into SYSTEM_DATE;
SELECT id_pay INTO _id from client where login = NEW.numdoc;
IF _id IS NULL THEN
RAISE EXCEPTION 'Нельзя зачислить платеж без регестрации %', NEW.numdoc;
END IF;
Select CAST(NEW.paysum::numeric AS bigint)* 10000000000 into SUM;
select description into TYPE_PAY from typepay where id = NEW.typepay_id;
DESCR := '' || TYPE_PAY || ' ' || '' || NEW.datepay || '' || ' ' || NEW.nazn ||' №' || NEW.term || '';
INSERT_SQL := 'insert into finace_operations (user_id,op_type,op_date,op_summa,system_date,descr,finance_real)
VALUES (''' || _id || ''',''' || OPTYPE || ''',''' || SYSTEM_DATE || ''',' || SUM || ',''' || SYSTEM_DATE || ''',''' || DESCR ||''',''' || NEW.paysum ||''')';
--SELECT 1, CURRENT_TIMESTAMP(0) INTO NEW.executeinideco, NEW.datecreate;
--NEW.executeinideco := 1;
--NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
PERFORM dblink_exec('dbname=*** user=*** password=***',INSERT_SQL);
ELSE
SELECT CURRENT_TIMESTAMP(0) INTO NEW.datecreate;
END IF;
RETURN NEW;
END;"

На некоторых записях не устанавливает-"NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));"
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39386125
grgdvo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2107tsm,

видимо exception срабатывает, текущая транзакция прерывается
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39386134
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
grgdvo2107tsm,

видимо exception срабатывает, текущая транзакция прерывается
По идеии если срабатывает exception на тригере BEFORE, то запись не должна заносится в таблицу, однако запись существует без New значение которые были указаны в тригере
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39386300
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2107tsmЕсть тригер стоит на таблице как
"СREATE TRIGGER before_finace
BEFORE INSERT
ON pay
FOR EACH ROW
EXECUTE PROCEDURE "pay to finace before v2"();"

Сам тригер
"
Код: sql
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.
DECLARE
INSERT_SQL text;
OPTYPE text;
SUM bigint;
SYSTEM_DATE text;
TYPE_PAY text;
DESCR text;
_id bigint;

BEGIN
IF NEW.typepay_id != 2423331 THEN --а если ? typepay_id IS NULL 
 IF NEW.paysum > 0 THEN
   OPTYPE := 2;
 ELSIF NEW.paysum < 0 and (NEW.typepay_id = 3181810 or NEW.typepay_id = 472295 or NEW.typepay_id = 57586)THEN
OPTYPE := 1;
 ELSE 
RAISE EXCEPTION 'Нельзя ставить отрицательный баланс киленту если это не перерасчет не повторка и не списание';
 END IF;
NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
select now()::timestamp into SYSTEM_DATE;
SELECT id_pay INTO _id from client where login = NEW.numdoc;
 IF _id IS NULL THEN
RAISE EXCEPTION 'Нельзя зачислить платеж без регестрации %', NEW.numdoc;
 END IF;
Select CAST(NEW.paysum::numeric AS bigint)* 10000000000 into SUM;
select description into TYPE_PAY from typepay where id = NEW.typepay_id;
DESCR := '' || TYPE_PAY || ' ' || '' || NEW.datepay || '' || ' ' || NEW.nazn ||' №' || NEW.term || '';
INSERT_SQL := 'insert into finace_operations (user_id,op_type,op_date,op_summa,system_date,descr,finance_real) 
VALUES (''' || _id || ''',''' || OPTYPE || ''',''' || SYSTEM_DATE  || ''',' || SUM  || ',''' || SYSTEM_DATE  || ''',''' || DESCR ||''',''' || NEW.paysum ||''')';
--SELECT 1, CURRENT_TIMESTAMP(0) INTO NEW.executeinideco, NEW.datecreate;
--NEW.executeinideco := 1;
--NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
PERFORM dblink_exec('dbname=*** user=*** password=***',INSERT_SQL);
ELSE --пришля сюда
SELECT CURRENT_TIMESTAMP(0) INTO NEW.datecreate; -- убивать
END IF;
RETURN NEW;
END;


"

На некоторых записях не устанавливает-"NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));"
-- теперь видно ?

а вот с этим :
Код: sql
1.
2.
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
select now()::timestamp into SYSTEM_DATE;



-- будет "без окон без дверцов полна джоппа огурцов" -- как только клиентская таймзона разойдется серверной.

"Д,Б."

чел, не форматирующий код структурно -- ССЗБ
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39386924
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq2107tsmЕсть тригер стоит на таблице как
"СREATE TRIGGER before_finace
BEFORE INSERT
ON pay
FOR EACH ROW
EXECUTE PROCEDURE "pay to finace before v2"();"

Сам тригер
"
Код: sql
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.
DECLARE
INSERT_SQL text;
OPTYPE text;
SUM bigint;
SYSTEM_DATE text;
TYPE_PAY text;
DESCR text;
_id bigint;

BEGIN
IF NEW.typepay_id != 2423331 THEN --а если ? typepay_id IS NULL 
 IF NEW.paysum > 0 THEN
   OPTYPE := 2;
 ELSIF NEW.paysum < 0 and (NEW.typepay_id = 3181810 or NEW.typepay_id = 472295 or NEW.typepay_id = 57586)THEN
OPTYPE := 1;
 ELSE 
RAISE EXCEPTION 'Нельзя ставить отрицательный баланс киленту если это не перерасчет не повторка и не списание';
 END IF;
NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
select now()::timestamp into SYSTEM_DATE;
SELECT id_pay INTO _id from client where login = NEW.numdoc;
 IF _id IS NULL THEN
RAISE EXCEPTION 'Нельзя зачислить платеж без регестрации %', NEW.numdoc;
 END IF;
Select CAST(NEW.paysum::numeric AS bigint)* 10000000000 into SUM;
select description into TYPE_PAY from typepay where id = NEW.typepay_id;
DESCR := '' || TYPE_PAY || ' ' || '' || NEW.datepay || '' || ' ' || NEW.nazn ||' №' || NEW.term || '';
INSERT_SQL := 'insert into finace_operations (user_id,op_type,op_date,op_summa,system_date,descr,finance_real) 
VALUES (''' || _id || ''',''' || OPTYPE || ''',''' || SYSTEM_DATE  || ''',' || SUM  || ',''' || SYSTEM_DATE  || ''',''' || DESCR ||''',''' || NEW.paysum ||''')';
--SELECT 1, CURRENT_TIMESTAMP(0) INTO NEW.executeinideco, NEW.datecreate;
--NEW.executeinideco := 1;
--NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
PERFORM dblink_exec('dbname=*** user=*** password=***',INSERT_SQL);
ELSE --пришля сюда
SELECT CURRENT_TIMESTAMP(0) INTO NEW.datecreate; -- убивать
END IF;
RETURN NEW;
END;


"

На некоторых записях не устанавливает-"NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));"
-- теперь видно ?

а вот с этим :
Код: sql
1.
2.
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
select now()::timestamp into SYSTEM_DATE;



-- будет "без окон без дверцов полна джоппа огурцов" -- как только клиентская таймзона разойдется серверной.

"Д,Б."

чел, не форматирующий код структурно -- ССЗБ
На таблице стоит typepay_id not null записи с этим параметром не проходят
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39386931
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а вот с этим :
Код: sql
1.
2.
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
select now()::timestamp into SYSTEM_DATE;



-- будет "без окон без дверцов полна джоппа огурцов" -- как только клиентская таймзона разойдется серверной.

"Д,Б."

чел, не форматирующий код структурно -- ССЗБ[/quot]

Не спасиб я лучше буду на платформе держать правильное время буду, это лучше чем клиентское которое хз знает откуда))
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39387002
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2107tsmйаа вот с этим :
Код: sql
1.
2.
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));
select now()::timestamp into SYSTEM_DATE;



-- будет "без окон без дверцов полна джоппа огурцов" -- как только клиентская таймзона разойдется серверной.

"Д,Б."

чел, не форматирующий код структурно -- ССЗБ

Не спасиб я лучше буду на платформе держать правильное время буду, это лучше чем клиентское которое хз знает откуда))

а сеанс пользователя выставит (жабка скажем) свою таймзону -- и плевать он (сеанс) хотел на то, что вы там "держать" будете.

т.е. пйонт в том, что так систайм оперделять нельзя. просто проверьте один раз руками-- и помедитируйте, как организовать ф--ю систайм (с возвратом таймстамп) , если не готовы к таймстамптз, который сделает это за вас.
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39387015
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2107tsmНа таблице стоит typepay_id not null записи с этим параметром не проходят
а typepay_id != 2423331 стоит ?
что буит при NEW.typepay_id = 2423331 ?
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39387362
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq2107tsmНа таблице стоит typepay_id not null записи с этим параметром не проходят
а typepay_id != 2423331 стоит ?
что буит при NEW.typepay_id = 2423331 ?
Я думаю логика должна работать так if typepay_id != 242333 'true' then или if typepay_id = 242333 'false' then else,
то есть если typepay_id != 242333 тогда правда, если typepay_id = 242333 тогда ложь то есть else.
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39387366
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2107tsmqwwqпропущено...

а typepay_id != 2423331 стоит ?
что буит при NEW.typepay_id = 2423331 ?
Я думаю логика должна работать так if typepay_id != 242333 'true' then или if typepay_id = 242333 'false' then else,
то есть если typepay_id != 242333 тогда правда, если typepay_id = 242333 тогда ложь то есть else.
так для кого я подкрасил этот самый "елсе" ?
где он, а где присвоение неприсвоенного ?
смотрим в книгу -- видим фигу, йопта


если и для != 2423331 проскакивает -- тогда интереснее. но пока отложим.
а вот про апдейт в теме поста, при инсерте -- в теле поста -- не понятно. вы всегда так внимательны ?
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39387623
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq2107tsmпропущено...

Я думаю логика должна работать так if typepay_id != 242333 'true' then или if typepay_id = 242333 'false' then else,
то есть если typepay_id != 242333 тогда правда, если typepay_id = 242333 тогда ложь то есть else.
так для кого я подкрасил этот самый "елсе" ?
где он, а где присвоение неприсвоенного ?
смотрим в книгу -- видим фигу, йопта


если и для != 2423331 проскакивает -- тогда интереснее. но пока отложим.
а вот про апдейт в теме поста, при инсерте -- в теле поста -- не понятно. вы всегда так внимательны ?
esle это false то есть если выражение вернуло false, оно всегда будет else если это присутствует в логике, если выражение имеет false оно будет смотреть на другие выражения пока не получит TRUE или END в противном случаи это есть тот самый else.
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39387629
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot qwwq]2107tsm
если и для != 2423331 проскакивает -- тогда интереснее. но пока отложим.
а вот про апдейт в теме поста, при инсерте -- в теле поста -- не понятно. вы всегда так внимательны ?
Что не понятного у него у при инсерте проблема с уникальность строк так как он их по одинаковому критерию берет ему надо либо делать через CURSOR либо через ctid Физическое расположение версии строки. Я просто набросал примерно на глаз запросы.
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39387819
qwwq
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2107tsmqwwqпропущено...

так для кого я подкрасил этот самый "елсе" ?
где он, а где присвоение неприсвоенного ?
смотрим в книгу -- видим фигу, йопта


если и для != 2423331 проскакивает -- тогда интереснее. но пока отложим.
а вот про апдейт в теме поста, при инсерте -- в теле поста -- не понятно. вы всегда так внимательны ?
esle это false то есть если выражение вернуло false, оно всегда будет else если это присутствует в логике, если выражение имеет false оно будет смотреть на другие выражения пока не получит TRUE или END в противном случаи это есть тот самый else.
скажите, уважаемый, русский язык вам родной ?

далее:
else -- это else. т.е. и False и NULL. в обоих случаях вы сразу попадаете из if--а на подкрашенный мною else без присвоения искомых вами полей. точка.
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39388292
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq2107tsmпропущено...

esle это false то есть если выражение вернуло false, оно всегда будет else если это присутствует в логике, если выражение имеет false оно будет смотреть на другие выражения пока не получит TRUE или END в противном случаи это есть тот самый else.
скажите, уважаемый, русский язык вам родной ?

далее:
else -- это else. т.е. и False и NULL. в обоих случаях вы сразу попадаете из if--а на подкрашенный мною else без присвоения искомых вами полей. точка.
Ахах ну да я в курсе что на else попадаю при null и если typepay_id = 2423331 и при этом условии мне не нужно присвоения полей.
Но мой вопрос изначально был когда typepay_id != 2423331 и typepay_id is not null и не присваются нужные поля
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39388300
2107tsm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwwq2107tsmпропущено...

esle это false то есть если выражение вернуло false, оно всегда будет else если это присутствует в логике, если выражение имеет false оно будет смотреть на другие выражения пока не получит TRUE или END в противном случаи это есть тот самый else.
скажите, уважаемый, русский язык вам родной ?

далее:
else -- это else. т.е. и False и NULL. в обоих случаях вы сразу попадаете из if--а на подкрашенный мною else без присвоения искомых вами полей. точка.
Даже запись dblink_exec('dbname=*** user=*** password=***',INSERT_SQL); проходить а вот На некоторых записях не устанавливает-"NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));"
...
Рейтинг: 0 / 0
Не работает тригер на update before
    #39388324
Фотография Maxim Boguk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2107tsmqwwqпропущено...

скажите, уважаемый, русский язык вам родной ?

далее:
else -- это else. т.е. и False и NULL. в обоих случаях вы сразу попадаете из if--а на подкрашенный мною else без присвоения искомых вами полей. точка.
Даже запись dblink_exec('dbname=*** user=*** password=***',INSERT_SQL); проходить а вот На некоторых записях не устанавливает-"NEW.execute := 1;
NEW.datecreate := (SELECT CURRENT_TIMESTAMP(0));"

Ну так поставьте десяток RAISE WARNING в хранимку отладочных на подозрительные места.
И по логам разбирайтесь что произошло.
Визуально отлаживать код когда там что то странное происходит - не эффективно.

--
Maxim Boguk
www.postgresql-consulting.ru
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Не работает тригер на update before
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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